我是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]]
。似乎所有元素都分配给了最后一个调用。
我完全糊涂了。有人可以帮忙吗?谢谢!
答案 0 :(得分:0)
那是因为:
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]]
在您的作业中,您只是创建了一个包含同一项[0,0,0]
的10个重复项的列表,因此对其中一个项目的任何更改都会反映到剩余的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
答案 1 :(得分:0)
列表是可变的,因此[[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])
答案 2 :(得分:0)