簡體   English   中英

了解python中實例屬性的名稱空間

[英]Understanding namespace of instance attributes in 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,具有相同的行為。

foobar3()您將分配全局barob變量的x屬性。 您未在聲明。 Python無法使用barob.x定義變量,因為它需要barob.x的現有實例來確定x值的放置位置。 因此,它首先要查找實例(並查找全局實例),而不是聲明變量。

如果首先允許Python聲明一個barob變量然后分配給它,那將是不同的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM