检查此答案:
本质上,Python中唯一引入新作用域的就是函数定义。类是一种特殊情况,因为直接在主体中定义的所有内容都放置在类的名称空间中,但不能从它们所包含的方法(或嵌套类)中直接访问它们。
在您的示例中,只有3个范围将在其中搜索x:
垃圾邮件的范围-包含在pre3和pre5(以及pre4,循环变量)中定义的所有内容
全局范围-包含pre1中定义的所有内容以及Foo(及其后的所有更改)
内置名称空间。有点特殊的情况-它包含各种Python内置函数和类型,例如len()和str()。通常,不应由任何用户代码对其进行修改,因此,期望它包含标准功能,而不包含其他任何功能。
仅当您在图片中引入嵌套函数(或lambda)时,才会出现更多作用域。但是,它们的行为几乎与您期望的一样。嵌套函数可以访问本地范围内的所有内容,也可以访问封闭函数范围内的任何内容。例如。
def foo(): x=4 def bar(): print x # Accesses x from foo's scope bar() # Prints 4 x=5 bar() # Prints 5
限制条件:
可以访问除局部函数的变量以外的范围中的变量,但是如果没有进一步的语法,则不能将其反弹到新参数。相反,赋值将创建一个新的局部变量,而不是影响父作用域中的变量。例如:
global_var1 = []global_var2 = 1def func(): # This is OK: It's just accessing, not rebinding global_var1.append(4) # This won't affect global_var2. Instead it creates a new variable global_var2 = 2 local1 = 4 def embedded_func(): # Again, this doen't affect func's local1 variable. It creates a # new local variable also called local1 instead. local1 = 5 print local1 embedded_func() # Prints 5 print local1 # Prints 4
为了在功能范围内实际修改全局变量的绑定,您需要使用global关键字指定该变量是全局变量。例如:
global_var = 4def change_global(): global global_var global_var = global_var + 1
当前,对于封装函数作用域中的变量,没有任何方法可以做,但是Python 3引入了一个新关键字
“ nonlocal”,它的作用与全局变量类似,但对于嵌套函数作用域。
可以访问除局部函数的变量以外的范围中的变量,但是如果没有进一步的语法,则不能将其反弹到新参数。相反,赋值将创建一个新的局部变量,而不是影响父作用域中的变量。例如:



