您好,匿名用户
随意问技术百科期待您的加入

python函数作用域问题

0 投票

发现了这个问题,百思不得其解;

bb=100
def func():
     print bb  #right
------------------------------
def func():
     bb=bb+1  #error

如上所示,调用函数func使用bb=bb+1会出错,unBoundError错误,为啥只打印bb时没错,执行了个自加一操作会出现?

用户头像 提问 2012年 12月1日 @ Akali 上等兵 (237 威望)
分享到:

1个回答

0 投票
 
最佳答案

因为在前一种形式下,由于没有赋值,解释器不知道这个变量在哪里定义,所以从函数内部作用域寻找这个变量,没找到,继续找全局作用域,找到了bb = 100,所以没问题,变量是有定义的,如果这时还没找到会继续查找builtin作用域。
而后一种因为产生了赋值,解释器认为这个变量是属于内部作用域的,而在赋值表达式的右边则需要查找这个变量的值,因为在函数内部作用域里找不到这个变量的定义,所以出错,你可以用以下形式得到相同作用

def func():
     global bb
     bb=bb+1

这正是python的一个让人不是很舒服的特性,对于函数内变量生存空间是由是否对这个变量赋值来决定的,只要产生赋值就是local scope.如果想知道更多细节可以阅读下PEP
http://www.python.org/dev/peps/pep-02...

用户头像 回复 2012年 12月1日 @ Singed 上等兵 (275 威望)
选中 2012年 12月1日 @Akali
提一个问题:

相关问题

0 投票
1 回复 26 阅读
用户头像 提问 2014年 2月15日 @ Cancer 上等兵 (211 威望)
0 投票
1 回复 38 阅读
用户头像 提问 2013年 9月23日 @ Ahri 上等兵 (292 威望)
0 投票
0 回复 34 阅读
用户头像 提问 2012年 12月1日 @ Sagittarius 上等兵 (289 威望)
0 投票
1 回复 37 阅读
用户头像 提问 2013年 9月11日 @ Kassadin 上等兵 (255 威望)
+2 投票
1 回复 94 阅读
用户头像 提问 2012年 12月26日 @ Poppy 上等兵 (395 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...