【问题标题】:Why Python Dictionary behaves like object reference? [duplicate]为什么 Python 字典的行为类似于对象引用? [复制]
【发布时间】: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


【解决方案1】:

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

如果你想在不影响初始字典的情况下修改字典,你必须明确地创建一个新字典。有不同的方法可以做到这一点。你可以这样做:

x = dict(a["first"])

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

【讨论】:

    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2017-10-26
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多