首页  >  问答  >  正文

python函数作用域问题

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

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

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

天蓬老师天蓬老师2764 天前547

全部回复(2)我来回复

  • 大家讲道理

    大家讲道理2017-04-17 11:03:04

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

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

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

    回复
    0
  • 黄舟

    黄舟2017-04-17 11:03:04

    的确是python一个很不舒服的特性。。

    回复
    0
  • 取消回复