参见示例,为什么=和.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似乎具有写入功能=不。我想深入研究为什么会这样。
答案 0 :(得分:9)
您的第一个示例将 value
重新绑定到新的列表对象。由于value
不再与字典值相关联,因此字典值完全不受影响。
第二个示例显式调用列表对象上的一个方法,该方法就地修改了对象。
Python名称仅仅是对实际对象的引用,如字典,列表,属性等。如果您将名称指向别的东西(将它们绑定到另一个对象),那么绑定到的前一个对象所发生的一切就是引用计数递减1.这可能导致对象从内存中清除,但它不会更改对象的值。
但是在一个对象(例如value.extend()
)上调用一个方法然后该方法可以影响该对象。由于list
对象是可变的,因此您将看到该变化反映在引用该对象的任何位置。