更改列表Python中的值

时间:2016-04-12 12:47:45

标签: python list

我是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]]。似乎所有元素都分配给了最后一个调用。 我完全糊涂了。有人可以帮忙吗?谢谢!

3 个答案:

答案 0 :(得分:0)

那是因为:

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]]

不同

在您的作业中,您只是创建了一个包含同一项[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)

你应该这样做:

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

或使用Python3的范围(10)

Python-guide

中很好地解释了这一点