我是编程和 Python 的新手,所以真的请原谅我的无知。
我刚刚了解到使用 global
可以使函数内部的变量成为全局变量。
然而,我发现了一些不符合我预期的事情:
我在 Python 3.8 中尝试了以下代码(请原谅我的无知,因为我不知道我还应该提供什么信息):
>>> x = 0
>>>
>>> def function():
... if False:
... global x
... x = 1
...
>>> function()
>>> print(x)
结果是1。
但是,我希望代码与以下代码具有相同的效果:
>>> x = 0
>>>
>>> def function():
... x = 1
...
>>> function()
>>> print(x)
结果应该是0。
在我看来,if False
中的语句应该不 执行,所以这对我来说听起来很奇怪。
另外,我个人认为,在某些情况下,我希望函数内的变量(无论是局部变量还是全局变量)依赖于其他代码……我的意思是,我想更改 if False
到类似 if A == 'A'
的东西,而(我希望)我可以根据我的条件语句控制 x
是全局的还是本地的。
我试过把if
改成while
,还是一样的……没有死循环,但是代码global x
仍在执行/编译...
我承认这听起来可能很天真,也许它在 Python 中行不通,但我真的很想知道为什么......似乎代码 global x
不可达,但怎么不被忽略?
谁能告诉我原因吗?我想知道更多关于编译背后的机制(?)
如有任何帮助,我们将不胜感激,谢谢!
最佳答案
在 python 中,global
语句(和 nonlocal
语句)与普通的 python 代码非常不同。本质上,无论函数中的 global
语句在哪里,它都会影响当前代码块,并且永远不会“执行”。您应该更多地将其视为编译器指令而不是命令。
请注意,语句本身必须在它修改的变量的任何使用之前出现,即
print(x)
global x
是语法错误。 global
语句只能修改整个代码块中的变量行为,你不能先有一个非全局变量,然后得到全局变量,你也不能有条件全局变量
(我真的找不到关于这种行为的好文档,here 它说 “全局语句是一个声明,它适用于整个当前代码块。” 和 ” global 是解析器的指令。它仅适用于与 global 语句同时解析的代码。” 但这对我来说似乎不是很清楚。)
python 中有更多的编译器指令,尽管它们看起来并不总是一个。一个是 from __future__ import
statements它看起来像模块导入但改变了 python 行为。
关于python - 为什么全局关键字即使无法访问也不会被忽略? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58899312/