我想在Python中重新分配列表中的每个项目。
In [20]: l = [1,2,3,4,5]
In [21]: for i in l:
....: i = i + 1
....:
....:
但名单根本没有变化。
In [22]: l
Out[22]: [1, 2, 3, 4, 5]
我想知道为什么会这样。任何机构都可以详细解释列表吗?感谢。
答案 0 :(得分:7)
你不能这样做,你只是将绑定的值改为名称i
。在for
循环的每次迭代中,i
被绑定到列表中的值。它不是指针,通过更改i
的值,您正在更改列表中的值。相反,正如我之前所说,它只是一个名称而你只是更改名称所指的值。在这种情况下,i = i + 1
会将i
绑定到值i + 1
。所以你实际上并没有影响列表本身,要做到这一点,你必须通过索引来设置它。
>>> L = [1,2,3,4,5]
>>> for i in range(len(L)):
L[i] = L[i] + 1
>>> L
[2, 3, 4, 5, 6]
有些pythonist可能更喜欢这样迭代:
for i, n in enumerate(L): # where i is the index, n is each number
L[i] = n + 1
但是,您可以使用列表解析轻松实现相同的结果:
>>> L = [1,2,3,4,5]
>>> L = [n + 1 for n in L]
>>> L
[2, 3, 4, 5, 6]
答案 1 :(得分:1)
这是因为Python处理变量及其引用的值。
您应该修改list元素本身:
for i in xrange(len(l)):
l[i] += 1
答案 2 :(得分:1)
>>> a = [1, 2, 3, 4, 5]
>>> a = [i + 1 for i in a]
>>> a
[2, 3, 4, 5, 6]
答案 3 :(得分:0)
最初我是指向列表中项目的指针,但是当你重新分配它时,它会指向新的数字,这就是为什么列表不会被更改。
对于可变对象的列表,它可以工作:
class Number(object):
def __init__(self,n):
self.n=n
def increment(self):
self.n+=1
def __repr__(self):
return 'Number(%d)' % self.n
a = [Number(i) for i in xrange(5)]
print a
for i in a:
i.increment()
print a
但是int不是可变的,当你对它们进行操作时会得到一个新的int对象,这就是为什么它在你的情况下不起作用。