教程集 www.jiaochengji.com
教程集 >  Python编程  >  Python入门  >  正文 Python新手常见问题四:误用Python作用域的规则

Python新手常见问题四:误用Python作用域的规则

发布时间:2021-12-28   编辑:jiaochengji.com
教程集为您提供Python新手常见问题四:误用Python作用域的规则等资源,欢迎您收藏本站,我们将为您提供最新的Python新手常见问题四:误用Python作用域的规则资源

误用Python作用域的规则

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

<pre class="brush:php;toolbar:false">>>> 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</pre>

这是怎么回事?

这是因为,在一个作用域里面给一个变量赋值的时候,Python自动认为这个变量是这个作用域的本地变量,并屏蔽作用域外的同名的变量。

相关推荐:《Python视频教程》

很多时候可能在一个函数里添加一个赋值的语句会让你从前本来工作的代码得到一个UnboundLocalError。(感兴趣的话可以读一读这篇文章。)

在使用列表(lists)的时候,这种情况尤为突出。看下面这个例子:

<pre class="brush:php;toolbar:false">>>> 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</pre>

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

答案和上一个例子一样,但是更加不易察觉。foo1并没有给lst赋值,但是foo2尝试给lst赋值。注意lst =[5]只是lst=lst [5]的简写,由此可以看到我们尝试给lst赋值(因此Python假设作用域为本地)。但是,这个要赋给lst的值是基于lst本身的(这里的作用域仍然是本地),而lst却没有被定义,这就出错了。

相关推荐:

Python新手常见问题三:在异常处理时错误的使用参数

您可能感兴趣的文章:
Python新手常见问题四:误用Python作用域的规则
Python新手常见问题五:在遍历列表的同时又修改该列表
一起来看看Python中常见的陷阱
学python能找什么工作
fluent python是什么意思
python难还是ruby难
cython与python的不同有哪些
学会了Python语言能做什么
python为何如此流行
Python新手常见问题三:在异常处理时错误的使用参数

[关闭]
~ ~