python - 范围规则的简短描述

标签 python scope

Python 作用域规则到底是什么?

如果我有一些代码:

code1
class Foo:
   code2
   def spam.....
      code3
      for code4..:
       code5
       x()

x 在哪里找到?一些可能的选择包括以下列表:

  1. 在随附的源文件中
  2. 在类命名空间中
  3. 在函数定义中
  4. 在for循环索引变量中
  5. for 循环内部

当函数 spam 被传递到其他地方时,执行期间也存在上下文。也许lambda functions通过有点不同?

某处一定有一个简单的引用或算法。对于中级 Python 程序员来说,这是一个令人困惑的世界。

最佳答案

其实是Python作用域解析的一个简明规则,来自Learning Python, 3rd. Ed. 。 (这些规则特定于变量名,而不是属性。如果您引用时不带句点,则适用这些规则。)

LEGB规则

  • Local - 在函数内以任何方式分配的名称(deflambda),并且未在该函数中声明为全局的功能

  • Enending-function - 在任何和所有静态封闭函数的本地范围内分配的名称(deflambda) ,从内到外

  • Global(模块)——在模块文件顶层分配的名称,或者通过在 def 中执行 global 语句分配的名称 文件内

  • Built-in (Python) — 在内置名称模块中预先分配的名称:openrange语法错误

所以,在这种情况下

code1
class Foo:
    code2
    def spam():
        code3
        for code4:
            code5
            x()

for 循环没有自己的命名空间。按照 LEGB 顺序,范围为

  • L:def spam 中的本地(在 code3code4code5 中)
  • E:任何封闭函数(如果整个示例位于另一个 def 中)
  • G:模块中(code1)中是否有全局声明的x
  • B:Python 中的任何内置 x

x 永远不会在 code2 中找到(即使在您可能期望的情况下,请参阅 Antti's answerhere)。

关于python - 范围规则的简短描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54052137/

相关文章:

javascript - 跨多个 promise 链保留数据

python - 使用 boolean 值的 If 语句的语法

python - 如何使用OpenCV、Python和zbar检测单个二维码

css - 如何为 IE 修复 ExtJS 作用域的 CSS?

ruby-on-rails - Rails 范围 : association is nil

python - 如何在 Tensorflow 的当前范围之外创建变量?

python - 在 Windows 8.1 上安装 lxml、libxml2、libxslt

python - Dask 分布式诊断网页无法正常工作

python - AWS Elasticbeanstalk : Command 02_createadmin failed 上的 Django

python - 如何让 Python 记住函数内部创建的列表以供将来使用