Python 3.x 为什么';重新分配到uu内置项uuu。dict是否会影响新字典对象的创建?
一位同学问了一个关于重写内置课堂听写的问题,经过一番摸索之后,我变得更加不确定 以内置命令为例。我可以分配此变量:Python 3.x 为什么';重新分配到uu内置项uuu。dict是否会影响新字典对象的创建?,python-3.x,built-in,Python 3.x,Built In,一位同学问了一个关于重写内置课堂听写的问题,经过一番摸索之后,我变得更加不确定 以内置命令为例。我可以分配此变量: >>> dict=5 >>> dict 5 现在我已经失去了对DICT的访问(这是像C++一样的阴影还是不同的?)但是我仍然可以通过 BufftIs >访问该类。但我也可以改写这一点: >>> __builtins__.dict = 6 >>> __builtins__.dict 6 但即使这样做也不会破坏
>>> dict=5
>>> dict
5
<>现在我已经失去了对DICT的访问(这是像C++一样的阴影还是不同的?)但是我仍然可以通过<强> BufftIs<强> >访问该类。但我也可以改写这一点:
>>> __builtins__.dict = 6
>>> __builtins__.dict
6
但即使这样做也不会破坏课堂本身:
>>> stillDict = {'key': 'value'}
>>> stillDict
{'key': 'value'}
那么,为什么在我跟踪它之后,这个类仍然“工作”?解释器如何知道我正在用这个作业制作一个字典,既然字典显然不需要\uuuuuu内置词\uuuuuuuu.dict
,它是如何构造的
编辑
再进一步,从simeon的回答来看,这是因为我正在创建一个字典文本
在覆盖之前,我可以执行以下操作:
>>> a = dict()
>>> a.items
<built-in method items of dict object at 0x0000000002C97C08>
这导致了后续的。。。
这两个仍然是“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\u MAP
(即,它根据您编写的代码构建一个映射/字典)
如您所述,dict
的含义已经改变
关于后续问题:您没有跟踪字典类/类型-您只是更改了
dict
的含义。当使用字典文本(例如,{}
)时,不能删除字典类型,Python会生成它
一旦你有了一个类型为
dict
的对象,你就可以访问它的方法(比如items()
)-只是你用语法(你不能影响语法)而不是调用dict()
(你可以影响语法)。@DanielB.:你的编辑没有改变任何东西dict
仍然存在于Python内部,只是无法通过名称访问它。任何访问和使用dict
的非基于姓名的方法都会继续有效。@DanielB。我已经扩展了关于这个问题的答案。所以即使是“builtins.dict”也只是一个句柄,而不是实际的类?@DanielB。没错,这只是一个可以重新定义的名字。
>>> 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