误用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,这是一个错误。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 一个例子来解释如何在 Python 中使用 continue11/29
- ♥ 如何在python中获取文件的路径08/15
- ♥ 什么是python链表12/12
- ♥ 如何从 github 下载和安装 python 库?09/25
- ♥ 如何包装python211/19
- ♥ python是如何真正实现多线程的?12/14
内容反馈