gpt4 book ai didi

Python:为什么只在赋值而不是读取时才需要全局?

转载 作者:IT老高 更新时间:2023-10-28 21:56:53 31 4
gpt4 key购买 nike

如果函数需要修改全局范围内声明的变量,则需要使用全局声明。但是,如果函数只需要读取一个全局变量,它可以不使用全局声明来完成:

X = 10
def foo():
global X
X = 20 # Needs global declaration
def bar():
print( X ) # Does not need global

我的问题是关于 Python 的设计:为什么 Python 设计为允许在不使用全局声明的情况下读取全局变量?也就是说,为什么只强制赋值具有全局,为什么不强制全局读取呢? (这会使它变得均匀而优雅。)

注意:我可以看到在阅读时没有歧义,但在分配时不清楚是否打算创建一个新的局部变量或分配给全局变量。但是,我希望 BDFL 这种不均衡的设计选择有更好的理由或意图。

最佳答案

使用嵌套范围,变量查找很容易。它们出现在一个链中,从本地开始,通过封闭 defs,到模块全局,然后是内置。规则是找到的第一个匹配获胜。因此,查找时不需要“全局”声明。

相比之下,对于写入,您需要指定要写入的范围。否则无法确定函数中的“x = 10”是表示“写入本地命名空间”还是“写入全局命名空间”。

执行摘要,通过 write 您可以选择命名空间,但对于查找,首先找到的规则就足够了。希望这会有所帮助:-)

编辑:是的,是这样的“因为 BDFL 是这么说的”,但是在没有类型声明的其他语言中,对于查找有一个首先找到的规则并且只需要一个非本地写入的修饰符并不罕见。仔细想想,这两条规则会产生非常干净的代码,因为只有在最不常见的情况下(非本地写入)才需要范围修饰符。

关于Python:为什么只在赋值而不是读取时才需要全局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360229/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com