Python 控制台和文本编辑器为 __builtins__ 输出不同的输出

The Python console and text editor output different output for __builtins__

我在 Blender(一种 3D 图形工具)中使用 Python 编写脚本。我最初打算 post 这个关于 blender stack exchange 的主题,但我得出的结论是它更接近 Python 的基础知识,这让我把问题写在这里。如果我上错论坛了请告诉我!

前段时间在Python中使用默认函数名作为变量名的错误,如list = ['a', 'b', 'c', 'd']。举个更极端的例子,如果我声明了一个像 print = 'a'.

这样的变量,我代码中的所有打印函数都不会工作。

所以我试着写了一段代码,打印出所有已经保留的变量名。即使我想使用 listprint 作为变量名,我也会使用不同的名称,因为我看到 True 返回并且知道这已经在 [=17 中使用了这些名称=].现在我已经在 Python 控制台中对其进行了测试,我转到文本编辑器并 运行 相同的代码,但这次我得到的是 False 而不是 True。发生了什么事?


我使用 dir() 函数来检查 __builtins__ 中的实际值。 Python 控制台的输出按预期在 __builtins__ 中包含 printlist,但文本编辑器的输出具有不同的值。仔细检查后,我注意到有 keysitemsvalues 等值,这些值是字典上可用的方法!


这次我使用了type()函数来打印__builtins__的类型。 Python 控制台打印 <class 'module'>,文本编辑器打印 <class 'dict'>


我知道 Blender 的 python 控制台和文本编辑器在不同的范围内分开工作,但我不知道具体发生了什么。为什么 __builtins__ 的输出不同?

您正在使用 Python 的不同实现,__builtins__ 的值在 the docs 中故意未指定。

As an implementation detail, most modules have the name __builtins__ made available as part of their globals. The value of __builtins__ is normally either this module or the value of this module’s __dict__ attribute. Since this is an implementation detail, it may not be used by alternate implementations of Python.

所以 __builtins__ 只是特定实现的一种便利机制,通常设置为 builtinsbuiltins.__dict__。看起来您的 Python 控制台执行前者而 Blender 的版本执行后者。要跨实现以统一的方式执行此操作,您可以执行

import builtins
print(type(builtins)) # <class 'module'>
print(type(builtins.__dict__)) # <class 'dict'>