将 dict 值设置为自身会创建无限副本

时间:2020-12-29 19:45:47

标签: python python-3.x dictionary

最近看到一段代码,看不懂。示例如下:

a = {}
a['value'] = a

print(a)
>>>> {'value': {...}}

因此,这会创建无限数量的初始 dict 副本,类似于:

{
    'value': {
      'value': {
        'value': {
                  ...
        }
      }
    }
}

那么,为什么会发生这种情况?这是某种递归的东西吗?

2 个答案:

答案 0 :(得分:7)

您的代码不会复制任何内容。 Python 理解您的变量是递归的,也就是说,它引用自身,并且不会尝试永远打印相同的内容。相反,它通过编写 ... 来打破循环引用。

您可以使用 a["value"] 关键字确定 is 确实不是您字典的副本:

>>> a = {}
>>> a["value"] = a
>>> a["value"] is a # they are the same object
True
>>> 

答案 1 :(得分:3)

这并不是真正的递归,而更像是一个引用循环。

当你这样做

a['value'] = a

您正在设置相同的字典、相同的对象作为名为“value”的键的配对值。

所以本质上它只是引用自身。重要的是它不会因为无限打印而崩溃,它理解自我引用。

如果您来自许多其他语言,您可能会对 python 感到相当困惑,因为引用被使用了很多。您可以在 documentation 中找到更多阅读材料,oreilly 也有一篇关于其中一些内容的简洁帖子 here