39

for在 Python 中使用循环迭代列表中的项目时,更改item(如下)是否会更改 中的相应项目items

for item in items:
    item += 1

items 中的每个项目会增加还是保持与循环之前相同?

[注意:我会对 Python 2.7 和 3.x 感兴趣]

4

2 回答 2

30

不,Python 中的变量不是指针。

它们改为引用堆上的对象,并且分配给变量不会更改引用的对象,而是变量。变量和对象就像绑在气球上的标签;assignment 将标签重新绑定到不同的气球。

请参阅我以前的答案,以进一步探索气球和标签的想法。

也就是说,一些对象类型实现了特定的就地添加行为。如果对象是可变的(气球本身可以改变),那么就地添加可以解释为突变而不是赋值。

因此,对于整数,item += 1实际上与item = item + 1因为整数是不可变的相同。您必须创建一个新的整数对象并将item标签绑定到该新对象。

另一方面,列表可变的,并且lst += [other, items]被实现为 alst.__iadd__([other, items])并且改变lst气球本身。分配仍然发生,但它是对同一对象的重新分配,因为该方法.__iadd__()只是返回self而不是新对象。我们最终将标签重新绑定到同一个气球上。

循环只是在每次迭代时为您提供对列表中下一项的引用。它不允许您更改原始列表本身(这只是另一组气球标签);相反,它为您包含的每个项目提供了一个新标签。

于 2013-02-11T15:06:57.413 回答
12

嗯,这真的取决于项目。

举个例子:

class test():
    pass

a = test()
a.value = 1

b = test()
b.value = 2

l = [a,b]

for item in l:
    item.value += 1

for item in l:
    print item.value

>>> 
2
3

在这种情况下:

l2 = [1,2,3]

for item in l2:
    item += 1

for item in l2:
    print item

>>> 
1
2
3

如您所见,您需要理解Martijn所说的指针。

于 2013-02-11T15:07:05.000 回答