当在 Python 中使用 for
循环遍历列表中的项目时,更改 item
(如下)会更改 items
中的相应项目>?
for item in items:
item += 1
items 中的每一项是递增还是保持与循环前相同?
[注意:我会对 Python 2.7 和 3.x 感兴趣]
最佳答案
不,Python 中的变量不是指针。
它们改为引用堆上的对象,并且分配给变量不会更改引用的对象,而是变量。变量和对象就像绑在气球上的标签; assignment 将标签重新绑定(bind)到不同的气球。
查看 previous answer of mine进一步探索气球和标签的想法。
也就是说,一些对象类型实现了特定的就地添加行为。如果对象是可变的(气球本身可以改变),那么就地添加可以被解释为突变而不是赋值。
因此,对于整数,item += 1
实际上与 item = item + 1
相同,因为整数是不可变的。您必须创建一个新的整数对象并将 item
标签绑定(bind)到该新对象。
另一方面,列表 是可变的,并且 lst += [other, items]
被实现为 lst.__iadd__([other, items] )
并且改变了 lst
气球本身。赋值仍然发生,但它是同一对象的 重新赋值,因为 .__iadd__()
方法只是返回 self
而不是新对象。我们最终将标签重新绑定(bind)到同一个气球。
循环只是在每次迭代时为您提供对列表中下一项的引用。它不允许您更改原始列表本身(这只是另一组气球标签);相反,它会为包含的每个项目提供一个新标签。
关于python - Python for 循环是否通过引用工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814771/