首页 > 解决方案 > 如果是字典,等号 ('=') 是否传递副本或引用?

问题描述

我有这个代码片段,它将平面列表转换为字典:(例如,来自:

`X = [['A', 'B', 'C'], ['A', 'B', 'D'],['W','X'],['W','Y','Z']]`

{'A': {'B': {'C': {}, 'D': {}}}, 'W': {'X': {}, 'Y': {'Z': {}}}}

编码:

d = {}

for path in X:
    current_level = d
    for part in path:
        if part not in current_level:
            current_level[part] = {}
        current_level = current_level[part]
        print('current_level = ', current_level)
        print('d = ', d)
print(d)

这是输出:

current_level =  {}
d =  {'A': {}}
current_level =  {}
d =  {'A': {'B': {}}}
current_level =  {}
d =  {'A': {'B': {'C': {}}}}
current_level =  {'B': {'C': {}}}
d =  {'A': {'B': {'C': {}}}}
current_level =  {'C': {}}
d =  {'A': {'B': {'C': {}}}}
current_level =  {}
d =  {'A': {'B': {'C': {}, 'D': {}}}}
current_level =  {}
d =  {'A': {'B': {'C': {}, 'D': {}}}, 'W': {}}
current_level =  {}
d =  {'A': {'B': {'C': {}, 'D': {}}}, 'W': {'X': {}}}
current_level =  {'X': {}}
d =  {'A': {'B': {'C': {}, 'D': {}}}, 'W': {'X': {}}}
current_level =  {}
d =  {'A': {'B': {'C': {}, 'D': {}}}, 'W': {'X': {}, 'Y': {}}}
current_level =  {}
d =  {'A': {'B': {'C': {}, 'D': {}}}, 'W': {'X': {}, 'Y': {'Z': {}}}}

因此current_level = d,似乎我们正在传递对字典的引用d。事实上,这本字典在那之后就不再出现在代码中了。

但是当我们这样做时: current_level = current_level[part]: current_leveldict 被赋予一个空 dict 的值,{}d不会改变(见输出)。

所以我很困惑:它是对字典的引用还是不同的副本?

标签: pythondictionary

解决方案


它始终是引用,但与 C++ 中的引用不同。
current_level = d意味着 thatcurrent_level现在指向d而不是它是对 的引用d

这意味着当您这样做时current_level = current_level[part],您不会更新d而是current_level[part]更新指向的对象的current_levelcurrent_level[part]


推荐阅读