当for
在 Python 中使用循环迭代列表中的项目时,更改item
(如下)是否会更改 中的相应项目items
?
for item in items:
item += 1
items 中的每个项目会增加还是保持与循环之前相同?
[注意:我会对 Python 2.7 和 3.x 感兴趣]
当for
在 Python 中使用循环迭代列表中的项目时,更改item
(如下)是否会更改 中的相应项目items
?
for item in items:
item += 1
items 中的每个项目会增加还是保持与循环之前相同?
[注意:我会对 Python 2.7 和 3.x 感兴趣]
不,Python 中的变量不是指针。
它们改为引用堆上的对象,并且分配给变量不会更改引用的对象,而是变量。变量和对象就像绑在气球上的标签;assignment 将标签重新绑定到不同的气球。
请参阅我以前的答案,以进一步探索气球和标签的想法。
也就是说,一些对象类型实现了特定的就地添加行为。如果对象是可变的(气球本身可以改变),那么就地添加可以解释为突变而不是赋值。
因此,对于整数,item += 1
实际上与item = item + 1
因为整数是不可变的相同。您必须创建一个新的整数对象并将item
标签绑定到该新对象。
另一方面,列表是可变的,并且lst += [other, items]
被实现为 alst.__iadd__([other, items])
并且改变lst
气球本身。分配仍然发生,但它是对同一对象的重新分配,因为该方法.__iadd__()
只是返回self
而不是新对象。我们最终将标签重新绑定到同一个气球上。
循环只是在每次迭代时为您提供对列表中下一项的引用。它不允许您更改原始列表本身(这只是另一组气球标签);相反,它为您包含的每个项目提供了一个新标签。
嗯,这真的取决于项目。
举个例子:
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所说的指针。