为什么 Python Dictionary 的行为类似于对象引用?[复制]

Why Python Dictionary behaves like object reference? [duplicate]

提问人:Alexey Kolosov 提问时间:3/29/2021 更新时间:3/29/2021 访问量:68

问:

我需要将 dict 中的 dict 作为副本使用,但是当我更改此副本时,原始 dict 也会更改。问题是:“是否有任何特定的文档来描述这种 Python 行为?

b = {"first_first": 10} # internal dict

a = {"first": b, "second": 5}  # full dict

print(a)  # {'first': {'first_first': 10}, 'second': 5}

x = a["first"] # new object creation (want to get a copy of the internal dict)
x["first_first"] = 8  # created object modification

print(a)  # {'first': {'first_first': 8}, 'second': 5} # Why was initial dict changed? Seems that 
# line : x = a["first"] passes a reference
python-3.x 字典 传递引用

评论

5赞 deceze 3/29/2021
“行为像对象引用”——那是因为它是。
0赞 Karl Knechtel 3/29/2021
例如,当您尝试将内容放入搜索引擎时会发生什么?Stack Overflow 并非旨在取代现有的教程或文档,并且针对特定文档源的建议是偏离主题的,因为它们过于主观。也就是说,该语言有关于 docs.python.org 的官方文档;目录有一个大而闪亮的“语言参考”类别,从那里您可以轻松访问相关部分python pass by reference
0赞 juanpa.arrivillaga 3/29/2021
没有任何地方复制。注意,dict 对象是对象,Python 中的一切都是对象。你认为为什么要创建一个副本?你想过会创建一个副本吗?Python 既不是按值调用,也不是按引用调用,但这在这里并不重要。x = a["first"]a["first"]
0赞 juanpa.arrivillaga 3/29/2021
请注意,赋值永远不会复制,也就是说,仅仅因为你这样做并不意味着你正在创建一个新对象,你只是在将某个对象赋给名称。现在,您可以定义自己的容器类型,当您索引/键入它时,它确实创建了一个副本,例如 可能会创建一个副本,但对于内置类型来说,情况从来都不是这样,尽管标准库中可能有几个示例(例如 对象)。可能很好读:nedbatchelder.com/text/names.htmlx = <whatever>xmy_custom_map["first"]shelve

答:

0赞 Cyrille Pontvieux 3/29/2021 #1

通过这样做,您将获得对内部对象的引用(这里是字典)a["first"]

如果要在不影响初始字典的情况下修改字典,则必须显式创建一个新字典。有不同的方法可以做到这一点。您可以简单地执行以下操作:

x = dict(a["first"])

x = a["first"].copy()