文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>"local variable referenced before assignment"..

"local variable referenced before assignment"..

时间:2010-03-07  来源:flyaway57

1)这种情况是自己碰到的,我把代码精简了一下,举个列子

>>> def max(a):
...     if a > 0:
...         b = 1
...     print b
...
>>> max(1)
1
>>> max(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in max
UnboundLocalError: local variable 'b' referenced before assignment

上面的代码中,当a大于0的时候,不会出现问题,但当a不大于0的时候,就报错了。
这种错误当代码少的时候容易发现,比较难办的就是,当你的代码很多,然后中间隔了很多行以后,再去调用b这个变量的时候,很难去发现这个问题。

解决办法:
1.把if-else写全,这样每种情况都会对b进行定义
2.在if之前给b一个默认值。这样的好处就是代码量小。

2)这种情况是局部变量和全局变量访问的问题。
首先看一个列子

#!/usr/bin/python

#global varibale
USER_COUNT = 0

#function
def main():
    adduser()

def adduser():
    print 'There are', USER_COUNT, 'users so far'

# actually run main()
main()

这段程序可以正常工作,函数adduser调用全局变量USER_COUNT

再看这一段,注意函数adduser()

#!/usr/bin/python

#global varibale
USER_COUNT = 0

#function
def main():
    adduser()

def adduser():
    USER_COUNT = USER_COUNT + 1
    print 'There are', USER_COUNT, 'users so far'

main()

这段程序的结果是”UnboundLocalError: local variable 'USER_COUNT' referenced before assignment“
想明白这点,就要知道python对变量访问的规则
当搜索一个变量的时候,python先从局部作用域开始搜索,如果在局部作用域没有找到那个变量,那样python就在全局变量中找这个变量,如果找不到抛出异常(NAMEERROR 或者 Unbound-
LocalError,这取决于你使用的python 版本。)

知道了对变量的访问规则,那就开始我们的解决办法
1.在函数adduser中加”global USER_COUNT“,就可以对全局变量进行操作。

def adduser():
    global USER_COUNT
    USER_COUNT = USER_COUNT + 1
    print 'There are', USER_COUNT, 'users so far'


2.在函数adduser中对变量”USER_COUNT“进行定义(这种情况,相当于使用一个新的变量,但是一个局部变量和一个全局变量同名是一件很不好的事情)

def adduser():
    USER_COUNT = 0
    USER_COUNT = USER_COUNT + 1
    print 'There are', USER_COUNT, 'users so far'


3)先把例子留到这里吧,因为自己还不是太明白这个,希望高手帮忙

def bankAccount():
    bal=0
    def credit(amount):
        bal=bal+amount
    def debit(amount):
        bal=bal-amount
    def balance():
        return bal
    return (lambda x: {"credit":credit,
                "debit":debit,
                "balance":balance
                }[x])
b=bankAccount()
print b("balance")()
b("credit")(100)


相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载