如果函数需要修改在全局作用域中声明的变量,则需要使用全局声明。但是,如果函数只需要读取全局变量,则无需使用全局声明即可实现:
X = 10
def foo():
global X
X = 20 # Needs global declaration
def bar():
print( X ) # Does not need global
我的问题是关于Python的设计:为什么Python的设计允许在不使用全局声明的情况下读取全局变量?也就是说,为什么只强制赋值具有全局,为什么不也强制全局读取?(这将使它变得均匀而优雅。)
注意:我可以看到在读取时没有歧义,但赋值时不清楚是要创建一个新的局部变量还是要赋值给全局变量。但是,我希望BDFL对这种不均衡的设计选择有更好的理由或意图。
发布于 2012-04-28 11:12:21
看看这段代码:
from module import function
def foo(x):
return function(x)
这里的名称function
是一个全局变量。如果我必须说global function
才能让这段代码工作,那就太乏味了。
在您说您的X
和我的function
是不同的之前(因为一个是变量,另一个是导入的函数),请记住,Python中的所有名称都被同等对待:使用时,它们的值在作用域层次结构中查找。如果你需要global X
,那么你就需要global function
。尼克。
发布于 2012-04-28 11:31:22
使用嵌套作用域,变量查找很容易。它们以一条链的形式出现,从局部变量开始,经过封闭的defs,到模块全局变量,然后是内建。规则是找到的第一个匹配项获胜。因此,查找时不需要"global“声明。
相比之下,对于写入,您需要指定要写入的作用域。否则,无法确定函数中的"x = 10“表示”写到本地名称空间“还是”写到全局名称空间“。
执行摘要,对于write,您可以选择名称空间,但是对于查找,先找到的规则就足够了。希望这能有所帮助:-)
Edit:是的,是这样的,“因为BDFL是这么说的”,但是在没有类型声明的其他语言中,有一个先找到的规则来查找,并且只需要一个修饰符来进行非本地写入,这并不少见。仔细想想,这两条规则会产生非常干净的代码,因为作用域修饰符只在最不常见的情况下(非本地写入)才需要。
发布于 2012-04-28 11:42:45
因为显式比隐式更好。
当你读取一个变量时,没有歧义。从local到global搜索作用域时,总是先找到第一个。
当你赋值时,解释器只能明确假设你赋值的两个作用域: local和global。由于赋值给local是最常见的情况,实际上不鼓励赋值给global,因此这是默认设置。要给global赋值,你必须显式地这样做,告诉解释器,在这个作用域中,无论你在哪里使用这个变量,它都应该直接转到全局作用域,并且你知道你在做什么。在Python 3中,你也可以用'nonlocal‘赋值给最近的封闭作用域。
请记住,当您在Python中为名称赋值时,此新赋值与先前已分配给其他对象的名称无关。想象一下,如果没有默认的local,而Python搜索了所有作用域,试图找到一个具有该名称的变量,并像读取时一样为它赋值。您的函数的行为不仅可以根据您的参数进行更改,还可以根据所包含的作用域进行更改。生活将是痛苦的。
https://stackoverflow.com/questions/10360229
复制相似问题