3

我想重新分配 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]

我想知道为什么会这样。任何机构都可以详细解释列表迭代吗?谢谢。

4

4 回答 4

7

你不能那样做,你只是改变绑定到 name 的值i。在循环的每次迭代中fori都绑定到列表中的一个值。从某种意义上说,它不是一个指针,即通过更改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]

一些 pythonistas 可能更喜欢这样迭代:

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]

欲了解更多信息:http ://www.effbot.org/zone/python-objects.htm

于 2013-04-16T07:14:58.857 回答
1

这是因为 Python 如何处理变量及其引用的值。

您应该修改列表元素本身:

for i in xrange(len(l)):
  l[i] += 1
于 2013-04-16T07:13:58.267 回答
1
>>> a = [1, 2, 3, 4, 5]
>>> a = [i + 1 for i in a]
>>> a
[2, 3, 4, 5, 6]
于 2013-04-16T07:28:21.050 回答
0

最初 i 是指向列表内项目的指针,但是当您重新分配它时,它将指向新编号,这就是列表不会更改的原因。

对于可变对象列表,它将起作用:

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 对象,这就是为什么它在你的情况下不起作用的原因。

于 2013-04-16T07:21:47.023 回答