python - 为什么全局关键字即使无法访问也不会被忽略? (Python)

标签 python global

我是编程和 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/

相关文章:

oop - 当需要全局访问时单例的替代方案

scope - 与 sbt 中的 `{.}/*:name` 和 `*/*:name` 的区别?

php - 使用全局变量字符串的替代方案以及与使用它们相关的任何安全问题?

javascript - 全局时 JSON 变量未定义

c - 跨不同共享库使用的全局变量

python - Odoo 记录创建时调用函数

python - Python 中的类字典对象,允许设置任意属性

python - 比较数据框中的两列并使用 Pandas 样式突出显示值

python - 通过嵌入字典的列表进行过滤

python - 术语 '\venv\Scripts\activate.ps1' 未被识别为 cmdlet、函数、脚本文件或可运行程序的名称