有人可以对这两个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
始终是对可迭代对象的元素的引用。问题实际上不是何时或何时不是参考的问题。它与您在循环中执行的赋值操作有关。
在第一个示例中,您使用对空字符串的另一个引用重新绑定对象中元素的原始引用。这意味着您实际上没有对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
请注意第一个示例中对象 ID 的变化情况。它是对新对象的引用。在第二个中,我们索引列表并替换容器中的值,但列表仍然是相同的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)