代码之家  ›  专栏  ›  技术社区  ›  Olivier Melançon iacob

删除后,我从何处访问\uu name\uuuu?

  •  2
  • Olivier Melançon iacob  · 技术社区  · 7 年前

    在我的Python Shell中,删除 __name__ 使其成为 'builtins' 。尽管如此 globals 确认我没有提到 __名称__ 来自某个全局变量。

    Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> __name__
    '__main__'
    >>> del __name__
    >>> __name__
    'builtins'
    >>> globals()[__name__]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'builtins'
    

    我的猜测是,我们是在某种程度上使用它的。这种行为是如何发生的?

    2 回复  |  直到 7 年前
        1
  •  5
  •   Alex Hall    7 年前

    所有名称首先从局部变量中查找,然后从全局变量中查找,然后从 __builtins__ ,随处可见。它是所有内置函数的所在。

    In[6]: __builtins__
    Out[6]: <module 'builtins' (built-in)>
    In[7]: __builtins__.__name__
    Out[7]: 'builtins'
    In[8]: __builtins__.len
    Out[8]: <function len>
    
        2
  •  4
  •   Aran-Fey Kevin    7 年前

    正如你可能从 __name__ ,您正在访问 builtins module

    每当您访问一个变量,而该变量在任何闭包、局部作用域或全局作用域中都找不到时,查找就会返回到内置变量。这就是为什么您可以访问以下内容 min max type 即使它们不是全局变量:

    >>> 'min' in globals()                                                                   
    False
    >>> min
    <built-in function min>      
    >>> __builtins__.min
    <built-in function min>                                                    
    

    同样的事情也发生在 __名称__ 。最初,有一个 __名称__ 全局范围中定义的变量:

    >>> globals()['__name__']
    '__main__'
    

    但一旦该名称被删除 del __name__ ,全局中的查找失败,并返回到内置-因此您最终会得到 内置的 单元

    >>> del __name__
    >>> __name__
    'builtins'
    >>> __builtins__.__name__
    'builtins'
    
    推荐文章