当 python 列表迭代是和不是参考时

Chr*_*son 3 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: ['', '', '']
Run Code Online (Sandbox Code Playgroud)

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

jdi*_*jdi 5

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

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

在第二个示例中,您正在执行索引操作并将新引用分配给该索引处的值。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
Run Code Online (Sandbox Code Playgroud)

注意在第一个例子中,对象 id 是如何改变的。它是对新对象的引用。在第二个中,我们对列表进行索引并替换容器中的值,但列表仍然是同一个对象。