社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  问与答

提问:UnboundLocalError 是如何来的?

bigpang • 7 年前 • 591 次点击  

背景:

  • python2.7
  • windows7
  • pycharm

错误内容:

coding:utf-8
import random

def func(ok):
    if ok:
        a = random.randint(1,10)
    else:
        import random
        a = random.randint(1, 10)
        print a
    return a

if __name__ == '__main__':
    func(True)

错误提示:

Traceback (most recent call last):
  File "F:/***/test_two.py", line 15, in <module>
    func(True)
  File "F:/***/test_two.py", line 6, in func
    a = random.randint(1,10)
UnboundLocalError: local variable 'random' referenced before assignment

个人的尝试:

这是来源于一篇文章,在解释关于命名空间和作用域时举的例子。戳这里,但是,并没有解释为什么。而我也不能明白出现错误的原理。在我的认知里面,如果local()中找不到random,那就到global中寻找random,那么肯定是能够找到顶部的random的,为何会出现UnboundLocalError的错误? 然后我进行了如下的尝试:

test_1
# coding:utf-8
import random

def func(ok):
    if ok:
        try:
            a = random.randint()
        except:
            global random
            a = random.randint(1,10)
    else:
        import random
        a = random.randint(1, 10)
        print a
    return a

if __name__ == '__main__':
    func(True)

结果显示

F:/****/test_two.py:9: SyntaxWarning: name 'random' is used prior to global declaration
  global random
test_2
# coding:utf-8

def func(ok):
    if ok:
        try:
            a = random.randint(1,10)
        except:
            global random
            a = random.randint(1,10)
    else:
        import random
        a = random.randint(1, 10)
    return a

if __name__ == '__main__':
    func(True)

错误:

F:/***/test_two.py:8: SyntaxWarning: name 'random' is used prior to global declaration
  global random
Traceback (most recent call last):
  File "F:/***/test_two.py", line 16, in <module>
    func(True)
  File "F:/***/test_two.py", line 9, in func
    a = random.randint(1,10)
NameError: global name 'random' is not defined
test_3
# coding:utf-8

def func(ok):
    if ok:
        try:
            a = random.randint(1,10)
        except:
            global random
            a = random.randint(1,10)
    else:
        import random
        a = random.randint(1, 10)
    return a

if __name__ == '__main__':
    func(False)
    func(True)
F:/***/test_two.py:8: SyntaxWarning: name 'random' is used prior to global declaration
  global random
test_4
# coding:utf-8

def func(ok):
    if ok:
        a = random.randint(0,10)
    else:
        import random
        a = random.randint(1, 10)
    return a

if __name__ == '__main__':
    func(False)
    func(True)



    
Traceback (most recent call last):
  File "F:/***/test_two.py", line 13, in <module>
    func(True)
  File "F:/***/test_two.py", line 5, in func
    a = random.randint(0,10)
UnboundLocalError: local variable 'random' referenced before assignment

有人可以帮我解释一下,为什么在例子中,会出现UnboundLocalError么?同时,为何在函数中执行到import random,后,global 能够得到random?这是python的什么原理或者规则?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/4590
 
591 次点击