2010-11-03 52 views
1
str2 = "Global" 

class InClass: 
str2 = "Class" 
def Set(self, msg): 
    self.str2 = msg 
def Print(self): 
    print(str2) 

g = InClass() 
g.Set("Instance") 
g.Print() 

如果我運行此代碼,則得到「Global」作爲結果。但我不明白爲什麼。LGB作用域規則和在Python中使用「self」

通過調用實例g的Set()方法,變量str2現在位於實例g的名稱空間中。然後,遵循LGB範圍規則,實例g的命名空間是第一個可以找到str2的命名空間!所以,結果應該是「實例」。

這是錯誤的嗎?

+1

你是什麼意思的「LGB範圍」? – 2010-11-03 08:38:45

回答

2

selfself.__class__從不在Python的作用域解析期間隱式搜索。

6

這不是這個工作原理。 print(str2)從方法內部訪問全局str2。要訪問str2成員,請使用print(self.str2)

請閱讀SO question and answers瞭解詳細信息。摘錄from there

在執行過程中的任何時候,有 至少有三個嵌套的範圍,其 命名空間是可以直接訪問: 最裏面的範圍,這是搜索 首先,包含本地名稱;任何封閉函數的 命名空間, ,這些命名空間是從 最近的封閉範圍開始搜索的;接下來搜索的中間 範圍包含當前模塊的全局名稱 ;和 最外面的作用域(最後搜索)是包含內置名稱的 名稱空間。

這不包括類成員,所以你必須明確地用self來引用它們。

0

因爲您已經定義了str2 =「Global」,python解釋器採用default.i同意Eli.if要打印,那麼您必須明確地打印(self.str2)以訪問類變量str2 =「Class」

print g.str2(會給你類作爲輸出)