为什么在复制其他类型时将字典作为对类的引用传递?

时间:2017-04-04 09:45:11

标签: python python-3.x

为什么字典作为对类的引用传递?

我曾经认为,当我将变量传递给类时,它们会被复制。

class MyClass:
    def __init__(self, arg=None):
        self.arg = arg

a = 'a'
m1 = MyClass(arg=a)
a = 'b'
print(m1.arg)  # Prints "a"

在使用Python很长一段时间后,我发现当我传递一个字典时,它不会被复制,而是被引用。因此,之后更改变量,更改classes变量。那是非常意外的。

d = {'a': 'a'}
m2 = MyClass(arg=d)
d['a'] = 'b'
print(m2.arg)  # Prints "{'a': 'b'} ... why suddenly 'b'?"

这只发生在字典中,还是引用了其他类型?为什么它不同呢?

1 个答案:

答案 0 :(得分:1)

这一切都归结为可变性,因为对象是可变的,对它的任何更改都不会返回新对象,而是改变现有引用。然后,在包含对该对象的引用的所有其他名称中都可以看到此更改。

字典和列表,两个可变结构的例子,适用于此处。 d['a'] = 'b'会改变字典,以便在self.arg中看到更改,其中包含对它的引用。

intstr等对象在操作时会返回一个新对象,即使您尝试执行以下操作:

a += 'b'

你期望改变str对象并反映在self.arg中,你会发现它没有失望,因为字符串是不可变的。

a = 'b'完全不同,它只是使名称a引用字符串对象'b';它没有尝试对a引用的现有值执行任何操作;用字典尝试相同的陈述。