【发布时间】:2021-06-25 08:44:03
【问题描述】:
我需要将 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 pass by reference放入搜索引擎时发生了什么? Stack Overflow 并不打算取代现有的教程或文档,并且针对特定文档来源的建议是题外话,因为它们过于主观。也就是说,该语言在 docs.python.org 上有 official 文档;目录有一个很大的闪亮的“语言参考”类别,从那里你可以很容易地找到relevant section。 -
无处你没有复制。注意,dict 对象是对象,Python 中的一切都是对象。为什么你认为
x = a["first"]会创建一个副本?你认为a["first"]会创建一个副本吗? Python 既不是按值调用也不是按引用调用,但这在这里并不真正相关。 -
注意,赋值永远不会复制,即仅仅因为你做了
x = <whatever>并不意味着你正在创建一个新对象,你只是将一些对象分配给名称x。现在,您可以定义自己的容器类型,当您对它进行索引/键入时,确实 创建了一个副本,例如my_custom_map["first"]可能创建一个副本,但对于内置类型而言,情况并非如此,尽管标准库中可能有几个示例(例如shelve对象)。可能很好读:nedbatchelder.com/text/names.html
标签: python python-3.x dictionary pass-by-reference pass-by-value