找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 303|回复: 6

[求助] 关于作用域的问题

2

主题

7

帖子

7

积分

贫民

积分
7
zhiweiovs 发表于 2017-8-21 22:10:26 | 显示全部楼层 |阅读模式
本人初学,请各位大能赐教:以下代码:
i=1
number=1
def num(n):
    i+=1
    if i<n:
        number=(number+1)*2
        print (number)
        num(number)
    else:
        return
num(10)
运行出现错误:
Traceback (most recent call last):
  File "C:\Documents and Settings\Administrator\桌面\3.py", line 11, in <module>
    num(10)
  File "C:\Documents and Settings\Administrator\桌面\3.py", line 4, in num
    i+=1
UnboundLocalError: local variable 'i' referenced before assignment   
明明i在num函数之前已经定义,作用域是全局,怎么会出现这个错误呢?

回复

使用道具 举报

3

主题

183

帖子

183

积分

侠客

积分
183
uitb 发表于 2017-8-22 12:02:45 | 显示全部楼层
在函数里面加个 global i
回复 支持 1 反对 0

使用道具 举报

0

主题

1

帖子

1

积分

贫民

积分
1
oppend 发表于 2017-8-22 10:25:38 | 显示全部楼层
然而这里的i并不是全局的那个
回复 支持 反对

使用道具 举报

2

主题

7

帖子

7

积分

贫民

积分
7
zhiweiovs  楼主| 发表于 2017-8-30 15:21:20 | 显示全部楼层
oppend 发表于 2017-8-22 10:25
然而这里的i并不是全局的那个

谢谢你的回答,不过我还是不明白为什么这个i不是全局那个i,按照LEGB原则,我在函数num里提到i,编译器如果在num里找不到之前有赋值过i,那就应该在全局里找,而我在全局里提到过i=1。
回复 支持 反对

使用道具 举报

2

主题

7

帖子

7

积分

贫民

积分
7
zhiweiovs  楼主| 发表于 2017-8-30 15:22:14 | 显示全部楼层
uitb 发表于 2017-8-22 12:02
在函数里面加个 global i

谢谢你的回答,不过我还是不明白为什么这个i不是全局那个i,按照LEGB原则,我在函数num里提到i,编译器如果在num里找不到之前有赋值过i,那就应该在全局里找,而我在全局里提到过i=1。
回复 支持 反对

使用道具 举报

3

主题

183

帖子

183

积分

侠客

积分
183
uitb 发表于 2017-8-30 18:33:16 | 显示全部楼层
zhiweiovs 发表于 2017-8-30 15:22
谢谢你的回答,不过我还是不明白为什么这个i不是全局那个i,按照LEGB原则,我在函数num里提到i,编译器如 ...

其实我也不太清楚这个问题的原因,不过Google了一下,发现一点东西
一、关于全局变量定义

QQ截图20170830182427.png
我理解的是,我们在顶层定义的变量,如果没有global关键字,在函数里面应该并会把它当做真正的全局变量
二、为什么要这样设计
QQ截图20170830182503.png
这位大哥的分析我觉得还是比较有道理的
参考:(链接截的图片,论坛帖子及回答有链接的话好像要审核,但审核的速度实在是慢)
QQ截图20170830183049.png
回复 支持 反对

使用道具 举报

2

主题

7

帖子

7

积分

贫民

积分
7
zhiweiovs  楼主| 发表于 2017-8-30 19:01:08 | 显示全部楼层
uitb 发表于 2017-8-30 18:33
其实我也不太清楚这个问题的原因,不过Google了一下,发现一点东西
一、关于全局变量定义

谢谢了,尽管我还是没完全理解,我再琢磨琢磨
回复 支持 反对

使用道具 举报

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

本版积分规则

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