python - Python for 循环是否通过引用工作?

标签 python

当在 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/

相关文章:

python - "()"在 python 日志配置中做什么

python - 创建 Spark DataFrame。无法推断类型的架构

python - IO错误: [Errno 21] Is a directory: '/tmp/speech_dataset/'

python - boto3是否支持到S3的VPC端点连接

python - re.finditer 循环是如何工作的?

python - 为什么ipython魔术函数 `%timeit -n1 code_block`会多次执行 `code_block`?

python - 在类中初始化装饰器变量

python - Pandas .DataFrame : How to align/group and sort data by index?

python - 如何在 python 中使用 SQL 时移动值

python - 在python中获取第n行字符串