鱼C论坛

 找回密码
 立即注册
查看: 1485|回复: 10

[已解决]新手请教:全局变量局部变量调用问题

[复制链接]
发表于 2018-4-4 13:21:07 | 显示全部楼层 |阅读模式

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

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

x
代码1:这样可以调用函数打印出外部变量var的值等于5。
var = 5
def inside():
    print(var)
inside()

代码2:这样也可以调用函数打印出内部变量var的值等于3.
var = 5
def inside():
    var = 3
    print(var)
inside()

代码3:这样就报错,原因是外部变量var这个时候被屏蔽,内部变量var没被赋值前你就想打印,所以不行。
var = 5
def inside():
    print(var)
    var = 3
inside()

对于新手,对于代码3我很疑惑,既然代码2能执行(代码2和3就是两个语句顺序颠倒一下)而且在代码3报错的时候都说了var这个内部变量没有被赋值前不能打印,那我理解为顺序还是你先走的打印,赋值代码在后面。
那既然创建和赋值内部变量的代码在后面,那为什么程序不能先理解这个var还是外部变量而打印出5呢?而非要报错呢,报错说明这个内部变量已经被创建了,但是还没有被赋值,那如果执行了var=3的语句,就应该同时创建并赋值了啊,怎么会分开?我非常混乱了。。。。。希望大家帮帮我。。。脑子碎了。

最佳答案
2018-4-4 15:36:25
对他不管你外面有没有全局变量,先看里面的,里面如果没有再找外面的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-4 13:38:22 | 显示全部楼层
正式因为函数内部定义了同名的变量,所以编译器才不能使用外部的变量,
如果用了,请问一下再次打印该打印哪一个呢?
var = 5
def inside():
    print(var)
    var = 3
    print(var)
inside()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-4 14:00:43 | 显示全部楼层
BngThea 发表于 2018-4-4 13:38
正式因为函数内部定义了同名的变量,所以编译器才不能使用外部的变量,
如果用了,请问一下再次打印该打印 ...

可能是我初学理解能力不行,关键代码三打印语句是在定义同名变量之前啊,所以我理解应该是能先答应的啊。
如果按照我现在的理解方式,你的这个这段代码应该是先答应5后打印3,应为5是在定义同名变量之前,所以外部变量还没被屏蔽,所以先答应出5这个外部变量了,后来定义了同名变量并且赋值为3,所以第二个print答应的是内部变量3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-4 14:11:33 | 显示全部楼层
python编译器是先扫描一遍函数存在内存里,当你调用的时候再执行,扫描的时候只要你函数里的语法错误立刻就报错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-4 14:32:32 | 显示全部楼层
你的函数作用域内部是一体的,不是各自独立的,也就是说如果函数体内有定义某一个变量,那么该函数体内都应该使用这个自己定义的变量,而不能到外部去取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-4 15:29:17 | 显示全部楼层
alltolove 发表于 2018-4-4 14:11
python编译器是先扫描一遍函数存在内存里,当你调用的时候再执行,扫描的时候只要你函数里的语法错误立刻就 ...

这个解答懂了,谢谢你哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-4 15:31:25 | 显示全部楼层
alltolove 发表于 2018-4-4 14:11
python编译器是先扫描一遍函数存在内存里,当你调用的时候再执行,扫描的时候只要你函数里的语法错误立刻就 ...

这个解答我貌似懂了,我可以理解为,当扫描的时候,我先这个函数内部已经定义了一个局部变量,但是因为现在还没执行,所以局部变量还没被赋值,所以当你执行的时候,就先执行的是print,但是这个时候已经知道这个函数里面重新定义了个局部变量,但是还没执行到赋值的语句,所以就直接报错了,我这么理解可以吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-4 15:36:25 | 显示全部楼层    本楼为最佳答案   
对他不管你外面有没有全局变量,先看里面的,里面如果没有再找外面的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-4 15:43:34 | 显示全部楼层
alltolove 发表于 2018-4-4 15:36
对他不管你外面有没有全局变量,先看里面的,里面如果没有再找外面的。

懂了,我可以理解为,先找里面的局部变量,就是找这个动作是最先发生的,完后才会发生按照顺序去执行里面的语句,比如先执行了print,再执行这个局部变量赋值,所以当执行到print的时候,你已经知道有这个局部变量了,但是赋值的语句还没执行,所以程序认为,你想打印一个还没有被定义赋值的局部变量,我这么理解可以吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-4 15:46:41 | 显示全部楼层
嗯,如果里面找不到他会暂时认为你的语法没毛病,在调用的时候再说。如果里面有了但是语法不对他会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-4 16:19:02 | 显示全部楼层
alltolove 发表于 2018-4-4 15:46
嗯,如果里面找不到他会暂时认为你的语法没毛病,在调用的时候再说。如果里面有了但是语法不对他会报错

非常感谢你,你的耐心解答给了我这个新手极大的鼓舞和帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 02:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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