Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 为什么';重新分配到uu内置项uuu。dict是否会影响新字典对象的创建?_Python 3.x_Built In - Fatal编程技术网

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