yz7268913 发表于 2020-7-1 22:41:43

小问题求助

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

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

yz7268913 发表于 2020-7-1 22:50:42

我自己想明白了,暴露智商了,怎么删帖{:5_109:}

Twilight6 发表于 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 所重新赋值


Twilight6 发表于 2020-7-1 22:58:01

yz7268913 发表于 2020-7-1 22:50
我自己想明白了,暴露智商了,怎么删帖


我才发现....

我刚才还在疯狂码字,你和我说你理解了???{:10_245:} 噗......

yz7268913 发表于 2020-7-1 23:00:55

Twilight6 发表于 2020-7-1 22:58
我才发现....

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

大佬速度太快了,失敬失敬{:10_254:}

Twilight6 发表于 2020-7-1 23:01:22

yz7268913 发表于 2020-7-1 23:00
大佬速度太快了,失敬失敬

{:10_281:}

yz7268913 发表于 2020-7-1 23:04:53

Twilight6 发表于 2020-7-1 23:01


认真的问一句,在哪里能删帖

Twilight6 发表于 2020-7-1 23:05:29

yz7268913 发表于 2020-7-1 23:04
认真的问一句,在哪里能删帖

删帖只有在没有人评论时候可删,否则只能寻求管理帮助~~
页: [1]
查看完整版本: 小问题求助