2014-11-05 35 views
1

爲什麼我可以在不使用全局變量的情況下在以下函數中使用類的實例?函數可以在不使用python全局的情況下訪問類的實例嗎?

class TestClass: 
    def __init__(self, name): 
     self.name = name 
    def MyName(self): 
     print "My name is: " + self.name 

def testFunc(): 
    # why can I use the instance here? 
    print "in testFunc()" 
    instance.MyName() 

if __name__ == '__main__': 
    instance = TestClass("abc") 
    print "in __main__" 
    instance.MyName() 

    testFunc() 
+0

if __name__ =='__main__':仍然是全局的 – 2014-11-05 10:03:04

回答

1

在Python,全局可達按名稱從任何範圍。您的test_func()功能可以按照名稱參考instance,因爲它已被綁定在全局範圍內,即在if __name__ == '__main__'區塊中。

global關鍵字對於何時想要綁定是本地範圍的全局名稱很有用。爲此,您聲明global foo,然後將其綁定,例如foo = 1,來自本地範圍內。

總結:當引用時,不需要名稱爲global的全局變量。當需要綁定全局變量時,需要global

2

在Python這條規則,你可以從一個函數,只要訪問全局名稱,沒有global因爲你不嘗試做分配給他們。也就是說,它們是隻讀的。 global僅在您要分配給全局名稱時才需要。

基本原理是分配給全局名稱是不明確的:它可能意味着創建本地名稱或分配給全局名稱。取決於全球名稱是否已被定義是一個壞主意,所以歧義實際上由global關鍵字解決。

但是,在不分配之前讀取名稱並不那麼含糊不清:它可能是全局名稱或錯誤。因此,假設全球一家沒有壞處。

請注意,使用名稱只讀而不是全局名稱,然後分配給它是錯誤。

g = 1 

def foo1(): 
    g = 2 #local name 

def foo2(): 
    global g 
    g = 2 #global name 

def foo3(): 
    print(g) #global name 

def foo4(): 
    print(g) #global name 
    g = 2 # error! 
1

我想你想要這樣的:

class TestClass(): 
    def foo(): 
     pass 

def test_func(): 
    instance.foo() 

def main(): 
    instance = TestClass 
    test_func() 

if __name__ == '__main__': 
    main() 

給出了這樣的錯誤:

$ python test.py 
Traceback (most recent call last): 
    File "test.py", line 13, in <module> 
    main() 
    File "test.py", line 10, in main 
    test_func() 
    File "test.py", line 6, in test_func 
    instance.foo() 
NameError: name 'instance' is not defined 

你看到區別?

1

testFunc在其本地空間第一個搜索: -

print locals() #in testFunc. 

output:-{} 

,那麼它搜索其格洛巴空間。 嘗試print globals在`testFunc 它

`'instance': <__main__.TestClass instance at 0x7f859aca64d0>`.` 

因此instancetestFunc入店。

蟒如下LEGB規則因此它搜索,如: - 1:-Locals 2:-Enclosing 3:-GLobals 4:-Builitins

相關問題