【发布时间】:2018-06-19 21:51:27
【问题描述】:
在下面的代码块中,我一直试图理解为什么 python 会这样。我已经完成了我的研究,但找不到一个好的答案,所以我来这里看看是否有人能指出我正确的方向或提供一个很好的澄清。 我知道这与一些旧的 ALGOL 原则有关,但我并不完全理解。
var = 5
def func1():
print(var)
func1()
def func2():
var = 8
print(var)
func2()
def func3():
print(var)
var = 8
func3()
这段代码的输出如下:
5
8
UnboundLocalError:赋值前引用了局部变量“var”
我明白为什么我们会得到输出“5”和“8”。但是对于'func3()',我期待输出'5'。看起来,解释器认为我想在函数中打印本地“var”而不是全局“var”。所以它会抛出这个错误。
或者,如果在函数内部的某个地方定义了一个变量,那么该函数将默认为局部变量,而不是同名的全局变量。
但是为什么 python 会这样呢?我不是在抱怨,我只是想了解一些事情......
如何在函数中使用预定义的全局变量,然后在同一函数中定义同名的局部变量,而不更改全局变量的值? (当然是在 python 中)
在此先感谢大家。你们是了不起的人! :)
Edit_1:感谢大家的精彩回答。我完全理解在函数中使用预定义的全局变量,然后在同一个函数中定义一个同名的局部变量是一个糟糕且不切实际的想法。我只是从理论的角度考虑它,因为我在大学讲座中看到了它。 XD 我找不到一个用例,最好这样做!
Edit_2:我已经阅读了 PEP8,并且我知道显式比隐式更好。 :) 这是真的。否则代码会令人困惑并导致错误。 这个问题只是关于我试图理解的一些无用和不切实际的大学理论。
编辑_3: 现在我完全理解它为什么会发生以及这里发生了什么。感谢Randall Valenciano 提供此链接到blog,它很好地解释了它。
发生的情况是函数被解释为一个整体,而不是逐行解释。因此,当函数被解释时,任何已定义变量的变量声明都被移到函数的顶部。因此,当我们打印“var”时,该函数正在使用尚未分配任何值的本地声明的变量,然后解释器会抱怨它并抛出错误。
再次感谢大家! :) 你对我帮助很大!现在我终于明白幕后发生了什么。
【问题讨论】:
-
和JS提升是一样的行为,这里有一个快速简洁的解释:foreigngods.com/blog/2013/09/14/26/…
-
是的,如果在分配给它的代码块中的任何位置,编译器会将其标记为本地。我们认为您不能使用全局变量然后在同一块中创建具有相同名称的局部变量。为什么你会想要?这听起来是个坏主意。
-
相关:stackoverflow.com/q/370357/1639625 但我认为这实际上是在问一个不同的问题。
-
你可以定义
def func3(var=var):;这会将局部参数var分配给全局var的值,而func3内部对var的所有赋值都转到局部变量,但是在定义函数时会这样做,所以局部@987654331调用函数时,@ 可能没有全局var的当前值。又是一个问题:你为什么要这个?
标签: python python-3.x python-3.5 python-3.6