|
1
434
实际上,Python范围解析的简明规则是 Learning Python, 3rd. Ed. . (这些规则特定于变量名,而不是属性。如果引用时没有句点,则适用这些规则。)
那么,在
这个
|
|
|
2
158
在您的示例中,只有3个作用域将在其中搜索x:
只有在图片中引入嵌套函数(或lambda)时,才会出现更多作用域。
限制: 可以访问除局部函数变量以外的作用域中的变量,但如果没有进一步的语法,则无法恢复到新参数。相反,分配将创建一个新的
为了从函数范围内实际修改全局变量的绑定,需要使用global关键字指定该变量为全局变量。如:
目前没有办法对封闭中的变量执行相同的操作
作用
范围,但Python 3引入了一个新关键字,“
|
|
3
113
关于蟒蛇3号的时间还没有完全的答案,所以我在这里做了一个回答。此处描述的大部分内容在 4.2.2 Resolution of names 阶级团体
不
除此之外,还有块语句
展示班级成员的特点
改为使用类变量。
对于许多Python新手来说,一个更大的惊喜是
这些理解可以作为一种巧妙的(或者糟糕的)方法,在Python 2中的lambda表达式中生成可修改的变量-lambda表达式确实创建了一个变量范围,如
这种行为在Python3中已得到修复-没有理解表达式或生成器泄漏变量。
全局实际上是指模块范围;python的主要模块是
作用域可以声明它显式地想要修改全局(模块作用域)变量,并使用global关键字:
在Python2中,没有简单的方法修改封闭范围中的值;通常,这是通过具有可变值来模拟的,例如长度为1的列表:
即
|
|
4
24
更完整的范围示例:
输出:
|
|
|
5
23
Python2.x的范围规则已经在其他答案中进行了概述。我唯一要补充的是,在Python3.0中,还有非局部作用域的概念(由“nonlocal”关键字表示)。这允许您直接访问外部作用域,并提供了一些巧妙的技巧,包括词法闭包(没有涉及可变对象的难看的hack)。 PEP 关于这方面的更多信息。 |
|
|
6
13
Python通常使用三个可用的名称空间来解析变量。
有两个功能:
名称空间由包、模块、类、对象构造和函数创建。没有任何其他风格的名称空间。
在本例中,Local是方法函数的主体
全球是——嗯——全球的。 规则是搜索由方法函数(和嵌套函数定义)创建的嵌套局部空间,然后搜索全局空间。就这样。
没有其他作用域。这个
对象(类的实例)具有实例变量。这些名称位于对象的命名空间中。它们必须由对象限定。(
在类方法中,有局部变量和全局变量。你说
|
|
|
7
9
code2(类成员)对同一类的方法中的代码不可见,您通常使用self访问它们。code4/code5(循环)与code3在同一范围内,因此如果您在其中写入x,您将更改code3中定义的x实例,而不是生成新的x。 Python的作用域是静态的,因此如果您将spam传递给另一个函数,spam仍然可以访问它来自的模块(在code1中定义)中的全局变量,以及任何其他包含作用域的函数(见下文)。代码2成员将再次通过self访问。 lambda与def没有什么不同。如果在函数中使用lambda,则与定义嵌套函数相同。在Python2.2以后的版本中,嵌套作用域是可用的。在这种情况下,您可以在任何级别的函数嵌套中绑定x,Python将选择最里面的实例:
|
|
8
3
值得注意的是,其他构造,例如
字体
查找
名称的范围从使用名称的范围开始,然后是模块全局的任何封闭范围(不包括类范围),最后是使用此搜索顺序中第一个匹配项的内置项。
这个
“到范围”默认为特殊窗体的当前范围
最后,理解和生成器表达式以及
嵌套作用域和名称解析这些不同的作用域构建了一个层次结构,内置的、全局的始终构成基础,闭包、局部变量和类作用域嵌套为 词法上
尽管
名称解析始终从
当前范围
范围声明和名称绑定
当名称必须引用外部变量时
和
如果要绑定到内部作用域,则必须将名称声明为非本地。不同类型的封闭作用域存在不同的声明:
值得注意的是,该函数是局部函数和局部函数
理解和赋值表达式列表、集合和dict理解以及生成器表达式的范围规则如下 几乎 几乎 与常规名称绑定相同。 理解和生成器表达式的范围与函数范围是相同的。范围中绑定的所有名称,即迭代变量,都是理解/生成器和嵌套范围的局部变量或闭包。所有名称(包括iterables)都使用函数内部适用的名称解析进行解析。
但是,理解/生成器中的赋值表达式在最近的 理解/生成器的范围,而不是理解/生成器本身的范围。嵌套多个理解/生成器时,将使用最近的函数或全局作用域。由于理解/生成器作用域可以读取闭包和全局变量,因此赋值变量在理解中也是可读的。从理解分配到类范围无效。
虽然迭代变量是其绑定的理解的局部变量,但赋值表达式的目标并不创建局部变量,而是从外部范围读取:
|
|
|
9
1
在Python中,
如果在当前范围内找不到变量,请参考LEGB顺序。 |