有时我可能会混淆术语,但我想我知道python名称空间和范围规则,以及global
关键字的用法。我知道从局部作用域(例如在函数内部)可以以只读模式访问全局作用域,除非声明变量global
。你知道吗
但是当上课的时候我发现有些奇怪。我希望这个例子足够清楚:
class Bar:
def __init__(self, x):
self.x = x
barob = Bar(6)
def foobar():
barob = Bar(3) #local scope, the barob in global namespace is not affected.
foobar()
print(barob.x) #prints 6
def foobar2():
global barob #barob is the one in global space
barob = Bar(3)
foobar2()
print(barob.x) #prints 3
到目前为止,一切都很清楚。但如果我这么做了:
barob = Bar(5)
def foobar3():
barob.x = 7
foobar3()
print(barob.x) #prints 7. Why?
所以我的问题是:为什么允许从foobar3()
的局部范围重新分配全局命名空间中barob
的x
属性?
当我向全局命名空间中的变量(在本例中是对象的属性)写入时,我可能会期望解释器发出UnboundLocalError
或其他类型的抱怨。
我最大的理解是,当涉及范围时,属性和变量的处理方式是不同的,但我不明白为什么。你知道吗
如果相关的话,我正在使用python3.6.7,但是我也尝试了python2.7,同样的行为。你知道吗
在
foobar3()
中,您指定了全局barob
变量的x
属性。你不是在申报。Python不能用barob.x
定义变量,因为它需要barob的现有实例来确定将x
的值放在何处。因此,它首先查找实例(并查找全局实例),而不是声明变量。你知道吗如果您首先允许Python声明一个
barob
变量,然后将其赋值,则情况会有所不同:相关问题 更多 >
编程相关推荐