84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
发现了这个问题,百思不得其解;
bb=100 def func(): print bb #right ------------------------------ def func(): bb=bb+1 #error
如上所示,调用函数func使用bb=bb+1会出错,unBoundError错误,为啥只打印bb时没错,执行了个自加一操作会出现?
func
bb=bb+1
unBoundError
欢迎选择我的课程,让我们一起见证您的进步~~
因为在前一种形式下,由于没有赋值,解释器不知道这个变量在哪里定义,所以从函数内部作用域寻找这个变量,没找到,继续找全局作用域,找到了bb = 100,所以没问题,变量是有定义的,如果这时还没找到会继续查找builtin作用域。 而后一种因为产生了赋值,解释器认为这个变量是属于内部作用域的,而在赋值表达式的右边则需要查找这个变量的值,因为在函数内部作用域里找不到这个变量的定义,所以出错,你可以用以下形式得到相同作用
def func(): global bb bb=bb+1
这正是python的一个让人不是很舒服的特性,对于函数内变量生存空间是由是否对这个变量赋值来决定的,只要产生赋值就是local scope.如果想知道更多细节可以阅读下PEPhttp://www.python.org/dev/peps/pep-02...
的确是python一个很不舒服的特性。。
因为在前一种形式下,由于没有赋值,解释器不知道这个变量在哪里定义,所以从函数内部作用域寻找这个变量,没找到,继续找全局作用域,找到了bb = 100,所以没问题,变量是有定义的,如果这时还没找到会继续查找builtin作用域。
而后一种因为产生了赋值,解释器认为这个变量是属于内部作用域的,而在赋值表达式的右边则需要查找这个变量的值,因为在函数内部作用域里找不到这个变量的定义,所以出错,你可以用以下形式得到相同作用
这正是python的一个让人不是很舒服的特性,对于函数内变量生存空间是由是否对这个变量赋值来决定的,只要产生赋值就是local scope.如果想知道更多细节可以阅读下PEP
http://www.python.org/dev/peps/pep-02...
的确是python一个很不舒服的特性。。