找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3250|回复: 4

[已解决] 关于UnboundLocalError出现的疑问

7

主题

33

帖子

33

积分

贫民

积分
33
bigpang 发表于 2017-12-13 11:28:33 | 显示全部楼层 |阅读模式
本帖最后由 bigpang 于 2017-12-14 13:24 编辑

代码:
  1. # coding:utf-8
  2. import random

  3. def func(ok=True):
  4.         if ok:
  5.                 a = random.randint(0,10)
  6.         else:
  7.                 import random
  8.                 a = random.randint(0,10)

  9. func()
复制代码
这是在一篇文章上讲述到的,python常见错误之一。
确实,这样运行会爆出UnboundLocalError的错误。但是,为什么呢?
如果在第一个a = random.randint(0,10)的地方,如果在本地的作用域中没有random,那应该到global中去寻找,global中应该有吖?通过print globals()是能看到有random的。。
所以,这是关于什么的知识点没有点通?我始终get不到,或者说,找不到一个合理的解释。


回复

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-12-13 13:06:25 | 显示全部楼层
bigpang 发表于 2017-12-13 12:26
进入func函数后,不执行python程序,而是对每个变量进行定义。该如何理解呢?
我是首先想的是,先给全部 ...

因为python是用c语言写的,如果想研究底层,可以去看看python源码剖析。

我的理解是,在调用func时,会把函数这个解析,而不是一行一行解析(比如你用c++的话,在编译的时候是有先后顺序,一行一行的,因为先后顺序变了,就会出现未定义,而再用c#的时候,你定义类的时候,它会把整个类的都解析与先后顺序无关),所以random就会被判别为本地变量而且是未定义的本地变量,在import random的时候才定义,所以你在定义之前调用,就是调用未定义的变量
回复 支持 1 反对 0

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-12-13 11:51:15 | 显示全部楼层
def func(ok=True):
        if ok:
                a = random.randint(0,10)
        else:
                random = 5
一样报错,首先在进入func函数后,不是执行python程序,而是对每个变量进行定义。
import random和random = 5一样都是对random变量赋值,所以函数内赋值的变量会定义为本地变量
而如果你的程序是
def func(ok=True):
        if ok:
                a = random.randint(0,10)
        else:
                return random
就是正常的, 因为没有random赋值,random不需要声明为本地变量
而如果在需要给random赋值的函数内调用全局变量需要如下
def func(ok=True):
        if ok:
                global random
                a = random.randint(0,10)
        else:
                import random
                a = random.randint(0,10)
回复 支持 反对

使用道具 举报

7

主题

33

帖子

33

积分

贫民

积分
33
bigpang  楼主| 发表于 2017-12-13 12:26:41 | 显示全部楼层
剑心无痕 发表于 2017-12-13 11:51
def func(ok=True):
        if ok:
                a = random.randint(0,10)

进入func函数后,不执行python程序,而是对每个变量进行定义。该如何理解呢?
我是首先想的是,先给全部的变量都定义了,如果是这样的话,那当执行到if里面的时候,本地就有random了,那为什么还报错?
还是说,先给所有的变量都定义了,相当于字典有了键,但是没有对应的值,所以它在本地找到了这个变量,不会往上找,而同时找到的变量没有指向内存的某个具体的对象,所以报错?但如果是这样,那我在func里面print locals(),却没有找到关于random的东西?
请问一下,这是一个怎么样的过程?我没能理解得到你想传达给我的讯息。
回复 支持 反对

使用道具 举报

7

主题

33

帖子

33

积分

贫民

积分
33
bigpang  楼主| 发表于 2017-12-13 13:34:31 | 显示全部楼层
剑心无痕 发表于 2017-12-13 13:06
因为python是用c语言写的,如果想研究底层,可以去看看python源码剖析。

我的理解是,在调用func时,会把 ...

谢谢版主大大,这样理解的话,比较理解得通。后面有余力就去看看源码。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表