命名空间和作用域

命名空间检索优先级

作用域
Python的作用域一共有4种,分别是:

  • L(Local):最内层,包含局部变量,比如一个函数/方法内部。
  • E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
  • G(Global):当前脚本的最外层,比如当前模块的全局变量。
  • B(Built-in): 包含了内建的变量/关键字等。,最后被搜索

规则顺序: L –> E –> G –>gt; B。

在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
图片说明

作用域

python只有模块(module)、类以及函数(def,lambda)才会引入新的作用于,其他的代码块(如,if/else,try/except,for/while等)是不会引入新的作用域的,语句内定义的变量,外部也可以访问。

全局变量,局部变量问题

实例

x=10
def fun():
    x=11
    print(x)
fun()
print(x)

按照正常的方式,第二个print应该是11

11
10

实际上是10,python的编程规则与C++的不同,全局变量可以引用,但是就需要global和nonlocal关键字。

x=10
def fun():
    global x
    x=11
    print(x)
fun()
print(x)

这样,就可以直接改变x的值
global适用于全局作用域,nonlocal适用于嵌套作用域
另外一种

x=10
def fun():
    x=x+1
    print(x)
fun()
print(x)

>>>Traceback (most recent call last):
  File "C:/Users/24201/Desktop/python学习/test.py", line 5, in <module>
    fun()
  File "C:/Users/24201/Desktop/python学习/test.py", line 3, in fun
    x=x+1
UnboundLocalError: local variable 'x' referenced before assignment

也就是说,可以访问,但不可修改
修改a为全局变量,通过函数参数传递,可以正常输出结果

x=10
def fun(x):
    x=x+1
    print(x)
fun(x)
print(x)
全部评论

相关推荐

06-19 12:33
安徽大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务