鱼C论坛

 找回密码
 立即注册
查看: 1103|回复: 7

[已解决]小问题求助

[复制链接]
发表于 2020-7-1 22:41:43 | 显示全部楼层 |阅读模式

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

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

x
请问这个输出结果为什么是先打印5,再打印3

def outside():
    var = 5
    print(var)
    def inside():
        var = 3
        print(var)
        
    inside()
outside()
最佳答案
2020-7-1 22:51:39



先说个 Python 的屏蔽机制吧(Ps:都是指没有 global 和 nonlocal声明下,因为如果声明了就不是局部变量了):

当函数内部的变量和函数外部全局作用域的变量名相同时,会触发 Python 的屏蔽机制,函数内部会创建一个同名的局部变量

来暂时覆盖同名的全局变量,此时在函数内部的值都为这个局部变量,只要一出此函数,那么该局部变量就不复存在,变会原来的全局变量


然后我们来看看代码:
def outside():
    var = 5
    print(var)
    def inside():
        var = 3
        print(var)
        
    inside()
outside()


函数先调用 outside() ,然后我们进入函数,var = 5 进行赋值,然后打印 var 的值 为 5

在函数内部在定义了一个内嵌函数 inside() ,定义完成后才进行调用,而 var=5 相对于内嵌函数 inside() 为全局变量

当你 inside() 函数内重新设置一个变量与全局变量 var 同名,导致触发Python 的屏蔽机制,将全局变量的 var 暂时屏蔽,在 inside函数内创建个局部变量 var = 3 来暂时覆盖了全局变量的 var = 5

所以在函数内 打印了一次 var = 3 ,但是一出函数局部变量 var = 3 就不复存在,又变回了 var = 5 ,而且代码按顺序来运行,打印的结果就为
5
3
这里你如果在函数 insude 调用后再次打印 你就会发现 var 还是 等于 5 而没有被 3 所重新赋值


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-1 22:50:42 | 显示全部楼层
我自己想明白了,暴露智商了,怎么删帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-1 22:51:39 | 显示全部楼层    本楼为最佳答案   



先说个 Python 的屏蔽机制吧(Ps:都是指没有 global 和 nonlocal声明下,因为如果声明了就不是局部变量了):

当函数内部的变量和函数外部全局作用域的变量名相同时,会触发 Python 的屏蔽机制,函数内部会创建一个同名的局部变量

来暂时覆盖同名的全局变量,此时在函数内部的值都为这个局部变量,只要一出此函数,那么该局部变量就不复存在,变会原来的全局变量


然后我们来看看代码:
def outside():
    var = 5
    print(var)
    def inside():
        var = 3
        print(var)
        
    inside()
outside()


函数先调用 outside() ,然后我们进入函数,var = 5 进行赋值,然后打印 var 的值 为 5

在函数内部在定义了一个内嵌函数 inside() ,定义完成后才进行调用,而 var=5 相对于内嵌函数 inside() 为全局变量

当你 inside() 函数内重新设置一个变量与全局变量 var 同名,导致触发Python 的屏蔽机制,将全局变量的 var 暂时屏蔽,在 inside函数内创建个局部变量 var = 3 来暂时覆盖了全局变量的 var = 5

所以在函数内 打印了一次 var = 3 ,但是一出函数局部变量 var = 3 就不复存在,又变回了 var = 5 ,而且代码按顺序来运行,打印的结果就为
5
3
这里你如果在函数 insude 调用后再次打印 你就会发现 var 还是 等于 5 而没有被 3 所重新赋值


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 22:58:01 | 显示全部楼层
yz7268913 发表于 2020-7-1 22:50
我自己想明白了,暴露智商了,怎么删帖


我才发现....

我刚才还在疯狂码字,你和我说你理解了??? 噗......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-1 23:00:55 | 显示全部楼层
Twilight6 发表于 2020-7-1 22:58
我才发现....

我刚才还在疯狂码字,你和我说你理解了??? 噗......

大佬速度太快了,失敬失敬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 23:01:22 | 显示全部楼层
yz7268913 发表于 2020-7-1 23:00
大佬速度太快了,失敬失敬

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-1 23:04:53 | 显示全部楼层

认真的问一句,在哪里能删帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 23:05:29 | 显示全部楼层
yz7268913 发表于 2020-7-1 23:04
认真的问一句,在哪里能删帖

删帖只有在没有人评论时候可删,否则只能寻求管理帮助~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 03:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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