python - 如果是字典,等号 ('=') 是否传递副本或引用?
问题描述
我有这个代码片段,它将平面列表转换为字典:(例如,来自:
`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_level
dict 被赋予一个空 dict 的值,{}
而d
不会改变(见输出)。
所以我很困惑:它是对字典的引用还是不同的副本?
解决方案
它始终是引用,但与 C++ 中的引用不同。
current_level = d
意味着 thatcurrent_level
现在指向d
而不是它是对 的引用d
。
这意味着当您这样做时current_level = current_level[part]
,您不会更新d
而是current_level[part]
更新指向的对象的current_level
值current_level[part]
推荐阅读
- flutter - Flutter:正在集成 PayPal 订阅 API 以实现定期付款,但我找不到任何可行的解决方案
- flutter - 颤振 | 扩展 FittedBox 内的 auto_size_text
- python - PySimpleGUIQt - 按下键或按钮作为动作
- scala - 获取 bigquery 表的描述
- javascript - 如何在点击手风琴时激活相应的图像?
- javascript - 如何在 React Native 中调用另一个函数内部的函数
- javascript - 无法在 node.js 中的模块外部使用 import 语句
- android-viewpager - 如何在 Jetpack Compose 中双向滚动
- logback - Logback - 仅记录消息而不是特定异常的堆栈跟踪
- java - 错误创建名称为通过字段表示的不满足依赖关系的 bean