理解python中实例属性的名称空间

2024-04-27 03:42:32 发布

您现在位置:Python中文网/ 问答频道 /正文

有时我可能会混淆术语,但我想我知道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()的局部范围重新分配全局命名空间中barobx属性?
当我向全局命名空间中的变量(在本例中是对象的属性)写入时,我可能会期望解释器发出UnboundLocalError或其他类型的抱怨。
我最大的理解是,当涉及范围时,属性和变量的处理方式是不同的,但我不明白为什么。你知道吗

如果相关的话,我正在使用python3.6.7,但是我也尝试了python2.7,同样的行为。你知道吗


Tags: theself属性defbar空间局部全局
1条回答
网友
1楼 · 发布于 2024-04-27 03:42:32

foobar3()中,您指定了全局barob变量的x属性。你不是在申报。Python不能用barob.x定义变量,因为它需要barob的现有实例来确定将x的值放在何处。因此,它首先查找实例(并查找全局实例),而不是声明变量。你知道吗

如果您首先允许Python声明一个barob变量,然后将其赋值,则情况会有所不同:

barob = Bar(5)
def foobar3():
    barob   = Bar(0)
    barob.x = 7

相关问题 更多 >