鱼C论坛

 找回密码
 立即注册
查看: 1947|回复: 9

[已解决]关于作用域,全局变量问题

[复制链接]
发表于 2017-3-4 22:32:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
写了两个程序,但有一个没报错,另一个确报错了,不知道问题出在哪,两个程序就差个赋值语句而已,(自己的猜测是:如果没有这个赋值语句来去改变外部变量的值,var默认就是外部变量的值,内部程序里是可以调用这个值的,虽然一般不支持这样做,如果有了赋值语句来改变值,内部程序里所有的var调用前都需要赋值语句来定义var,否则不能调用)求大神解释下!!

第一个程序如下:
>>> def outside():
        var=5
        def inside():
                print(var)
        inside()
>>> outside()
5





第二个程序及报错如下:

>>> def outside():
        var=5
        def inside():
                print(var)
                var=3
        inside()

       
>>> outside()
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    outside()
  File "<pyshell#7>", line 6, in outside
    inside()
  File "<pyshell#7>", line 4, in inside
    print(var)
UnboundLocalError: local variable 'var' referenced before assignment
     
最佳答案
2017-3-5 20:46:41
作用域这一块的话,或许可以用PHP的语法解释一下,作用域内的变量可以这样着看:inside里的变量在inside中进行查找,如果查找不到,就会往外查找,一直到windows下。而你第二个函数,先是打印var,后又赋值var,那么打印var的时候就查找var变量,但是下面的var又赋值了,就导致了语法冲突,未定义就先打印变量,导致出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-4 23:10:02 | 显示全部楼层
建议看一下闭包这一节的课程,错误一样的,在print上面加一句nonlocal var 应该就好了
inside()作为内部函数,python就把里面的var作为局部变量,外部的var就被屏蔽了起来,当你尝试对它进行操作时就报错了…………
同为新手,欢迎指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-4 23:23:12 | 显示全部楼层
我前几天也是遇到类似的问题,最好还是老老实实把需要用到的外部变量传给inside()吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-5 11:01:29 | 显示全部楼层
你第二个代码报错是因为你读取了外部变量var,这个外部var也写入内部里面了,然后你重新定义var,那么就产生重名冲突

你第一个之所以没有报错是因为没有读取外部变量var,在内部重写一个var,内部var就比如成一个小var,仅仅在内部有效。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-5 20:22:21 | 显示全部楼层
上衫夏乡 发表于 2017-3-4 23:10
建议看一下闭包这一节的课程,错误一样的,在print上面加一句nonlocal var 应该就好了
inside()作为内部 ...

我第一个程序inside()也对var进行操作了啊,print(var),不就没报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-5 20:25:23 | 显示全部楼层
32269100 发表于 2017-3-5 11:01
你第二个代码报错是因为你读取了外部变量var,这个外部var也写入内部里面了,然后你重新定义var,那么就产 ...

首先,重新定义var是在inside()里的,作用域是inside()自己的,不会产生重名冲突一说,起码这个不是报错的原因
其次,我第一个函数肯定读取外部变量var了啊,不然最后那个输出5是怎么输出出来的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-5 20:46:41 | 显示全部楼层    本楼为最佳答案   
作用域这一块的话,或许可以用PHP的语法解释一下,作用域内的变量可以这样着看:inside里的变量在inside中进行查找,如果查找不到,就会往外查找,一直到windows下。而你第二个函数,先是打印var,后又赋值var,那么打印var的时候就查找var变量,但是下面的var又赋值了,就导致了语法冲突,未定义就先打印变量,导致出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-6 11:50:36 | 显示全部楼层
五行缺五行 发表于 2017-3-5 20:46
作用域这一块的话,或许可以用PHP的语法解释一下,作用域内的变量可以这样着看:inside里的变量在inside中 ...

谢谢给我这个思路,我觉得我可以接受这个解释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-6 11:54:48 | 显示全部楼层
32269100 发表于 2017-3-6 08:49
第一个是我看错了,我承认第一个的解释完全错误。

第二个我是没错的,你先在inside里面print(var), ...

谢谢这位仁兄,不过我还是比较容易接受楼上五行缺五行的解释:inside里的变量在inside中进行查找,如果查找不到,就会往外查找,一直到windows下。当我在inside里print(var)是他就会在inside里找var变量,咦结果找到了var=3这个赋值语句,所以在inside()里是有定义的,这就导致出现一个语法错误:如果能找到的话,肯定是先定义后打印,而我这个程序是先打印后定义,我感觉我还是比较容易接受这个解释!!不过还是谢谢仁兄了,或许你说的也是这个意思,但语句组织的我看起来比较难理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-6 15:41:52 | 显示全部楼层
视频里还是作业里貌似有答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 10:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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