参见示例,为什么 = 和 .extend 之间存在这种差异:
d1=[1,2,3]
d2=[7,8,9]
d={1:d1,2:d2}
for key,value in d.items():
value=['a','b','c']
输出:{1: [1, 2, 3], 2: [7, 8, 9]}
for key,value in d.items():
value.extend(['a','b','c'])
输出:{1: [1, 2, 3, 'a', 'b', 'c'], 2: [7, 8, 9, 'a', 'b', 'c ']}
.extend 似乎具有 = 没有的写入功能。我想深入探讨一下为什么会这样。
请您参考如下方法:
您的第一个示例重新绑定(bind) value 到一个新的列表对象。因为 value 不再与字典值相关联,所以字典值完全不受影响。
第二个示例显式调用列表对象的方法,该方法就地更改对象。
Python 名称只是对实际对象的引用,字典、列表、属性等也是如此。如果您将名称指向其他对象(将它们绑定(bind)到另一个对象),则之前绑定(bind)的对象所发生的一切就是引用计数减 1。这会导致对象从内存中清除,但不会更改对象的值。
但是在对象上调用方法(例如 value.extend())然后该方法可能影响对象。由于 list 对象是可变的,您会看到该更改反射(reflect)在引用该对象的所有地方。
