为什么字典作为对类的引用传递?
我曾经认为,当我将变量传递给类时,它们会被复制。
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'?"
这只发生在字典中,还是引用了其他类型?为什么它不同呢?
答案 0 :(得分:1)
这一切都归结为可变性,因为对象是可变的,对它的任何更改都不会返回新对象,而是改变现有引用。然后,在包含对该对象的引用的所有其他名称中都可以看到此更改。
字典和列表,两个可变结构的例子,适用于此处。 d['a'] = 'b'
会改变字典,以便在self.arg
中看到更改,其中包含对它的引用。
int
或str
等对象在操作时会返回一个新对象,即使您尝试执行以下操作:
a += 'b'
你期望改变str
对象并反映在self.arg
中,你会发现它没有失望,因为字符串是不可变的。
a = 'b'
完全不同,它只是使名称a
引用字符串对象'b'
;它没有尝试对a
引用的现有值执行任何操作;用字典尝试相同的陈述。