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)
为什么A
和B
不再引用同一个对象?
我看过这个问题:Python空字典没有通过引用传递? 它验证了这种行为,但答案解释了如何修复提供的脚本,而不是为什么会出现这种情况.
这是一个图形表示*:
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
为其重新分配标识符,但不影响B
或A
先前引用的字典.你应该阅读这篇文章,它很好地涵盖了这类事情.
请注意,作为替代方法,您可以使用该dict.clear
方法就地清空字典:
>>> A = {1: 1}
>>> B = A
>>> A[2] = 2
>>> A.clear()
>>> B
{}
Run Code Online (Sandbox Code Playgroud)
作为A
并B
仍然引用同一个对象,现在都"看到"空版本.
*对于第一个近似 - 类似的引用行为也在字典中进行,但由于值是不可变的,因此它不太相关.