怎么避免误用Python作用域的规则-创新互联

创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!

创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站建设、成都网站建设、江西网络推广、微信小程序、江西网络营销、江西企业策划、江西品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们大的嘉奖;创新互联为所有大学生创业者提供江西建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com

这篇文章运用简单易懂的例子给大家介绍怎么避免误用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 "", line 1, in 
  File "", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment

这是怎么回事?

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

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

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

>>> 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 "", line 1, in 
  File "", 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作用域的规则就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


名称栏目:怎么避免误用Python作用域的规则-创新互联
文章路径:http://scyanting.com/article/depdds.html