为什么这个空dict会破坏共享引用?

Mac*_*ckM 2 python dictionary pass-by-reference

我发现一些令我困惑的Python行为.

>>> A = {1:1}
>>> B = A
>>> A[2] = 2
>>> A
{1: 1, 2: 2}
>>> B
{1: 1, 2: 2}
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都表现得像预期的那样.A和B都引用相同的,可变的,字典,并且改变一个改变另一个.

>>> A = {}
>>> A
{}           # As expected
>>> B
{1: 1, 2: 2} # Why is this not an empty dict?
Run Code Online (Sandbox Code Playgroud)

为什么AB不再引用同一个对象?

我看过这个问题:Python空字典没有通过引用传递? 它验证了这种行为,但答案解释了如何修复提供的脚本,而不是为什么会出现这种情况.

jon*_*rpe 8

这是一个图形表示*:

A = {1: 1} 
# A -> {1: 1}
B = A
# A -> {1: 1} <- B
A[2] = 2
# A -> {1: 1, 2: 2} <- B
A = {}
# {1: 1, 2: 2} <- B    
# A -> {}
Run Code Online (Sandbox Code Playgroud)

A = {}创建一个全新的对象A为其重新分配标识符,但影响BA先前引用的字典.你应该阅读这篇文章,它很好地涵盖了这类事情.


请注意,作为替代方法,您可以使用该dict.clear方法就地清空字典:

>>> A = {1: 1}
>>> B = A
>>> A[2] = 2
>>> A.clear()
>>> B
{}
Run Code Online (Sandbox Code Playgroud)

作为AB仍然引用同一个对象,现在都"看到"空版本.


*对于第一个近似 - 类似的引用行为也在字典中进行,但由于值是不可变的,因此它不太相关.