知行编程网知行编程网  2022-12-09 18:00 知行编程网 隐藏边栏  4 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于Python新手常见问题四:误用Python作用域的规则的相关知识,希望可以帮到处于编程学习途中的小伙伴


Python新手FAQ 4:误用Python作用域规则


误用Python作用域的规则

Python的作用域解析是基于叫做LEGB(Local(本地),Enclosing(封闭),Global(全局),Built-in(内置))的规则进行操作的。这看起来很直观,对吧?事实上,在Python中这有一些细微的地方很容易出错。看这个例子:

>>> x = 10
>>> def foo():
...     x += 1
...     print x
...
>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment

这是怎么回事?

这是因为,当给一个作用域内的变量赋值时,Python 会自动认为该变量是该作用域的局部变量,并在作用域外屏蔽同名变量。

很多时候可能会向函数添加赋值语句,并且你会从以前的工作代码中得到一个 UnboundLocalError。 (如果你有兴趣,可以阅读这篇文章。)

使用列表时尤其如此。考虑以下示例:

>>> lst = [1, 2, 3]
>>> def foo1():
...     lst.append(5)   
# 这没有问题...
...
>>> foo1()
>>> lst
[1, 2, 3, 5]
 
>>> lst = [1, 2, 3]
>>> def foo2():
...     lst += [5]      
# ... 这就有问题了!
...
>>> foo2()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'lst' referenced before assignment

嗯?为什么foo2有问题,而foo1没有问题?

答案与前面的示例相同,但更加微妙。 foo1 没有给 lst 赋值,但是 foo2 试图给 lst 赋值。请注意,lst+=[5] 只是 lst=lst+[5] 的简写,因此我们可以看到我们正在尝试为 lst 赋值(因此 Python 假定作用域是本地的)。但是,要赋给lst的值是基于lst本身的(这里的作用域还是局部的),但是没有定义lst,这是一个错误。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享