Python 作用域问题,int 型变量为什么会有些特殊呢

2019-12-08 19:04:02 +08:00
 whoops

是这样的,做练习时用闭包实现一个计数器,使用整型变量会报错

UnboundLocalError: local variable 'cnt' referenced before assignment

代码如下:

def counter():
   cnt = 0
   def add_one():
       cnt += 1
       return cnt
   return add_one
a=counter()
print(a()) 
#把整型变量换成列表就可以
def counter():
   cnt = [0]
   def add_one():
       cnt[0] += 1
       return cnt[0]
   return add_one
a=counter()
print(a()) 

初学不才,请教一下大家

5784 次点击
所在节点    Python
43 条回复
XIVN1987
2019-12-09 16:14:43 +08:00
cnt += 1 等价于 cnt = cnt +1,python 中对没用 global 和 nonlocal 修饰的变量赋值,该变量就会被认定为局部变量,后面的 cnt + 1 引用了一个还没有值的局部变量,所以就报错了

cnt[0] += 1 等价于 cnt[0] = cnt[0] + 1,注意,这里并没有给 cnt 赋值,所以查找变量时会使用 LEGB 规则,,cnt[0] + 1 引用变量 cnt,局部作用域没有它的定义,所以就跑去闭包中查找,,所以不会报错
ethego
2019-12-09 16:36:44 +08:00
@FrankHB 我想的没有你这么复杂。。不过如你所说,显式区分声明与赋值的语言不需要考虑问题。后面的语言也很少采用这种设计了。
BTW,刚试了下 Julia 和 Ruby 的实现一样:
https://gist.github.com/ethe/b489d96e6e92ba5e1726a990d909ce73
XIVN1987
2019-12-09 16:46:29 +08:00
Python 学习手册第 17 章有说明

![]( )

简单来说:python 的函数内赋值的变量,,只要没用 global 和 nonlocal 修饰,,python 都认为它是局部变量,,比如下面这段程序执行会报错

``` python
s = 'lucy'

def test():
print(s)

s = 'lily'

test()
```

报错消息是:UnboundLocalError: local variable 's' referenced before assignment

就是因为 print 后面有给 s 赋值的语句,,所以 python 认定 s 是局部变量

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/627037

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX