python - 当 python 列表迭代是和不是引用时

标签 python reference

谁能简明扼要地解释一下这两个 Python 操作在修改列表方面的区别?

demo = ["a", "b", "c"]

for d in demo:
    d = ""

print demo
#output: ['a', 'b', 'c']

for c in range(len(demo)):
    demo[c] = ""

print demo
#output: ['', '', '']

换句话说,为什么第一次迭代不修改列表?谢谢!

最佳答案

循环变量d 始终是对可迭代对象元素的引用。问题实际上不是何时或何时不是引用的问题。它是关于您在循环中执行的赋值操作。

在第一个示例中,您将对象中元素的原始引用重新绑定(bind)到另一个对空字符串的引用。这意味着您实际上没有对 做任何事情。您只需为该符号分配一个新的引用。

在第二个示例中,您正在执行索引操作并为该索引处的值分配一个新引用。 demo 保持相同的引用,并且您正在替换容器中的值。
该赋值实际上等同于:demo.__setitem__(c, "")

a = 'foo'
id(a)  # 4313267976
a = 'bar'
id(a)  # 4313268016

l = ['foo']
id(l)  # 4328132552
l[0] = 'bar'
id(l)  # 4328132552

请注意在第一个示例中,对象 ID 发生了怎样的变化。它是对新对象的引用。在第二个中,我们对列表进行索引并替换容器中的值,但列表仍然是同一个对象。

关于python - 当 python 列表迭代是和不是引用时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14113641/

相关文章:

python - 如何在 ctypes 中声明带有指向数组指针的 C 结构?

java - 使用字符串引用原始文件夹中的文件

c++ - C++ 中的引用初始化

javascript - VueJS 传递默认属性而不引用子组件

C++地址之间的区别

python - 将 None 传递给参数是否正确?

python - i18n 打破 Turbogears 设置 -wiki20 教程

Python npy文件如何访问变量

c++ - 通过引用类的构造函数传递 std::map 不更新 map

python - 在 Chrome 中使用 Selenium 和 Python 单击 "download"按钮并下载 PDF