gpt4 book ai didi

python-3.x - 为什么重新分配给 __builtins__.dict 不会影响新字典对象的创建?

转载 作者:行者123 更新时间:2023-12-04 15:20:02 24 4
gpt4 key购买 nike

一个同学问了一个关于覆盖内置类字典的问题,经过一番摸索,我变得更加不确定。

拿内置的字典。我可以分配这个变量:

>>> dict=5
>>> dict
5

现在我失去了对 dict 的访问权限(这会像在 C++ 中一样隐藏还是不同?)但我仍然可以通过 访问该类内置 .dict。但我也可以覆盖它:
>>> __builtins__.dict = 6
>>> __builtins__.dict
6

但即使这样做也不会破坏类(class)本身:
>>> stillDict = {'key': 'value'}
>>> stillDict
{'key': 'value'}

那么为什么在我隐藏它之后这个类仍然“工作”呢?解释器如何知道我正在用这个作业制作字典,以及字典是如何构造的,因为它显然实际上并不需要 __builtins__.dict ?

编辑
更进一步,从 simeon's answer 说这是因为我正在创建一个字典文字......

在覆盖之前,我可以这样做:
>>> a = dict()
>>> a.items
<built-in method items of dict object at 0x0000000002C97C08>

覆盖 dict 和 __builtins__.dict 后, 我可以做这个:
>>> b = {}
>>> b.items
<built-in method items of dict object at 0x000000000288FC88>

这导致了后续...
这两个仍然是“dict对象”,dict类是否只是使用构造函数来制作dict对象?为什么在隐藏类后我仍然可以访问内置方法?

最佳答案

{'key': 'value'}是字典文字,因此继续具有生成字典的行为。 Python不需要查什么dict意思是——它跳过这一步,直接生成字节码来构造字典:

>>> def f(): {'a': 3}
>>> import dis
>>> dis.dis(f)
1 0 BUILD_MAP 1
3 LOAD_CONST 1 (3)
6 LOAD_CONST 2 ('a')
9 STORE_MAP
10 POP_TOP
11 LOAD_CONST 0 (None)
14 RETURN_VALUE

在字节码中它继续使用 BUILD_MAP和以前一样(即,它根据您编写的代码构建 map /字典)。
dict的含义像你说的那样变了。

关于后续问题:您没有隐藏字典类/类型-您只是更改了 dict 的含义方法。当使用字典字面量(例如, {} )时,不能去掉字典类型,Python 会生成它。

一旦你有一个 dict 类型的对象你可以访问它的方法(比如 items() )——只是你使用语法(你不能影响)而不是调用 dict() 来构造它。 (你可以影响)。

关于python-3.x - 为什么重新分配给 __builtins__.dict 不会影响新字典对象的创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36108483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com