Python - =和.extend for循环中的差异

时间:2014-03-06 14:01:52

标签: python for-loop python-3.x extend

参见示例,为什么=和.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似乎具有写入功能=不。我想深入研究为什么会这样。

1 个答案:

答案 0 :(得分:9)

您的第一个示例 value重新绑定到新的列表对象。由于value不再与字典值相关联,因此字典值完全不受影响。

第二个示例显式调用列表对象上的一个方法,该方法就地修改了对象。

Python名称仅仅是对实际对象的引用,如字典,列表,属性等。如果您将名称指向别的东西(将它们绑定到另一个对象),那么绑定到的前一个对象所发生的一切就是引用计数递减1.这可能导致对象从内存中清除,但它不会更改对象的值

但是在一个对象(例如value.extend())上调用一个方法然后该方法可以影响该对象。由于list对象是可变的,因此您将看到该变化反映在引用该对象的任何位置。