为什么dict不可变对象的属性,其中的列表是可变对象

时间:2017-10-22 11:55:41

标签: python

我正在观看探索python。它有一个例子:

    >>> d1 = {'name': 'ethan', 'books': ['book1', 'book2', 'book3']}
    >>> d2 = d1.copy()
    >>> d2['name'] = 'peter'         
    >>> d2
    {'books': ['book1', 'book2', 'book3'], 'name': 'peter'}
    >>> d1
    {'books': ['book1', 'book2', 'book3'], 'name': 'Ethan'}

dict不是价值关键对象吗?为什么它说name的值是一个不可变对象,所以d1的属性不会改变。

2 个答案:

答案 0 :(得分:0)

因为为了使查找更快,python为字典的每个键计算哈希值。如果密钥对象从某个其他类更改,但不知道它被用作字典中的键,则不会通知字典,并且会在后续查找中在错误的位置查找它。

答案 1 :(得分:0)

字典copy方法显式创建副本。这与可变性无关。尝试

d2=d1

看看你的期望。此外,对象是可变的意味着你无法改变它。尝试更改元组,例如:

x=(1,2,3)
x[0]=4

注意 - 这与其他变量无关。事实上,试试:

(1,2,3)[0]=4

小编辑

d1的副本很浅,意味着books的列表只复制了它的引用。因此,改变列表,所有指向它的东西都会被看到 - 两者都是。请注意,列表已更改,而不是dicts。