簡體   English   中英

更改列表Python中的值

[英]change value in list Python

我是python的新手。 更改2Xn列表中的值存在問題。 下面是我嘗試的代碼:

alist =[[0,0,0]]*10
b=[0]*10

for i in range(10):
    alist[i][0]=i
    alist[i][2]=2i
    b[i]=I

我期望的是:

alist=[[0,0,0],[1,0,2],[2,0,4],...[9,0,18]], 
b=[0,1,2,..9]

事實證明b是我所期望的,但是alist=[[9,0,18],[9,0,18],[9,0,18],...[9,0,18]] 所有元素似乎都分配給了最后一次調用。 我很困惑。 有人可以幫忙嗎? 謝謝!

那是因為 :

alist =[[0,0,0]]*10alist = [[0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0]]

在您的作業中,您僅創建了一個由10個相同項目[0,0,0]重復列表,因此對其中一個所做的任何更改都將反映到其余9個重復項中。

參見下面的演示:

>>> x = [0,0,0]
>>> id(x)
140348692006664
>>> 
>>> 
>>> l1 = [x]*10
>>> l2 = [[0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0]]
>>> 
>>> 
>>> for i in l1:
        print(id(i))


140348692006664
140348692006664
140348692006664
140348692006664
140348692006664
140348692006664
140348692006664
140348692006664
140348692006664
140348692006664
>>> 
>>> 
>>> for j in l2:
        print(id(j))


140348692008712
140348692008648
140348691779528
140348692008520
140345708853320
140348692007688
140348691927176
140348691829640
140348691831112
140345708570760

其次, alist是一個可變對象(列表)的列表,因此,由於您的分配性質( alist = [[0,0,0]]*10 ),任何一個對象的更改都會反映給另一個對象。 ,而blist是不可變對象的列表(整數0的列表),因此當您執行blist[i]=i您並沒有更改值,而是創建了對新對象的新引用。

>>> l4 = ['1']*10 #list of immutable objects
>>> l4
['1', '1', '1', '1', '1', '1', '1', '1', '1', '1']
>>> 
>>> 
>>> l4[0]='0'
>>> l4
['0', '1', '1', '1', '1', '1', '1', '1', '1', '1'] #only first item affected
>>> 
>>> l5 = [{1:'1'}]*10 #list of mutable objects
>>> 
>>> l5
[{1: '1'}, {1: '1'}, {1: '1'}, {1: '1'}, {1: '1'}, {1: '1'}, {1: '1'}, {1: '1'}, {1: '1'}, {1: '1'}]
>>> 
>>> l5[0][1] = 'ONE'
>>> 
>>> l5
[{1: 'ONE'}, {1: 'ONE'}, {1: 'ONE'}, {1: 'ONE'}, {1: 'ONE'}, {1: 'ONE'}, {1: 'ONE'}, {1: 'ONE'}, {1: 'ONE'}, {1: 'ONE'}] #all affected

列表是可變的,因此[[0,0,0]] * 10將為您提供一個包含對同一列表的十個引用的列表,因此對其中任何一個的更改將是對所有列表的更改。 (是的,這是關於Python的一些小技巧,需要習慣!)

有許多方法可以生成所需的列表列表。 其中之一是使用簡單的列表理解:

alist = [[i, 0, 2 * i] for i in range(10)]

編輯:如果您還不習慣列出理解,上面的內容等同於:

alist = []
for i in range(10):
   alist.append([i, 0, 2 * i])

你應該做:

alist = [[0, 0, 0] for __ in xrange(10)]

或對Python3使用range(10)

這在Python指南中有很好的解釋

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM