Python 蟒蛇3‘内置’并不总是‘内置’__`

Python 蟒蛇3‘内置’并不总是‘内置’__`,python,python-3.x,Python,Python 3.x,我正在为python3实施这个想法。 并且懒得使用变量\uuuuuuuuuu而不是模块内置。这应该没有什么区别,因为: # file spam.py: import builtins print (builtins is __builtins__) print (id(builtins)) print (id(__builtins__)) 有趣的是:builtins在导入时不是\uuuu builtins\uuuu: $ python3 spam.py True 14059800174333

我正在为python3实施这个想法。 并且懒得使用变量
\uuuuuuuuuu
而不是模块
内置
。这应该没有什么区别,因为:

# file spam.py:
import builtins
print (builtins is __builtins__)
print (id(builtins))
print (id(__builtins__))
有趣的是:
builtins
在导入时不是
\uuuu builtins\uuuu

$ python3 spam.py 
True
140598001743336
140598001743336

$ python3 -c 'import spam'
False
139755426543080
139755426520904
有人知道会发生什么吗


(给定页面上的一条评论提到,“
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>是一个CPython特性,你真的不应该使用它”,但我很好奇

框架全局变量有一个
\uuuu内置变量
变量(内置字典,或 当
\uuuu name\uuuuu
等于
\uuuuu main\uuuu
时的内置模块


因此,在第一种情况下(
\uuuu name\uuuuu==\uuuuu main\uuuuuu
),您得到
\uuuuuuuu内置的
作为
内置的
模块,但在第二种情况下(
\uuuu name\uuuuuuuuuu!=\uuu main\uuuuuuu
\uuuu内置的
是一个
实例,来自:

\uuuu内置\uuuu
的值通常是此模块或值 此模块的
\uuuu dict\uuuu
属性

试验 使用稍微修改的
spam.py

import builtins

if __name__ == '__main__':
    print(type(__builtins__))
    print(__builtins__ is builtins)
    print(id(builtins))
    print(id(__builtins__))
else:
    print(type(__builtins__))
    print(__builtins__ is builtins.__dict__)
    print(id(builtins.__dict__))
    print(id(__builtins__))
我们会得到类似于

$ python3 spam.py 
<class 'module'>
True
2345652270648
2345652270648

$ python3 -c 'import spam'
<class 'dict'>
True
2770543697736
2770543697736
$python3 spam.py
真的
2345652270648
2345652270648
$python3-c“导入垃圾邮件”
真的
2770543697736
2770543697736
结论
正如您和切普纳已经注意到的那样,
\uuuuuuuuuuuuuuuuuuuuuuuuuuu
是一个可以更改的实现细节,因此我们不应该依赖它,特别是它是一个
内置模块/
内置对象。

对于CPython实现

\uuuu main\uuuuuuu
模块中:
\uuuuu内置\uuuuuuuuuu是内置的

在其他模块中:
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

参考文献:

\uuuuuuuuuuuuuuuuuuuuuuuuuuu
是一个具体的实现细节,因此您不应该依赖它。