[英]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]]*10
與alist = [[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])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.