2012-11-14 162 views
1

我已經閱讀了幾個有關使變量爲全局變量並使用class.var功能在類之間共享它們的答案,但這些變量在我的示例中似乎都不起作用。Python名稱空間和全局變量

我只有一個文件:app.py它實例化多個類。然而,我想讓全局變量不在類中,它只是在主腳本中。後來,當我在一個函數裏面的一個類類型的全局變量globvar,我得到的錯誤:`

NameError: global name 'globvar' is not defined. 

我怎麼能按引用這個變量傳遞給類(我知道,並不是Python的語言)以便類可以修改它,但其他類可以訪問它,或者使其成爲全局的,以便所有類都可以訪問它?

編輯底部文件沒有縮進:

app = MyApp(False) 
logFile = open('C:/Python26/temp/test.txt', 'w') 
globvar = 7 
ser = serial.Serial('com5',115200,timeout=0.01) 
app.MainLoop() 

然後在我的第一個I類有:

class MyApp(wx.App): 
    def MainLoop(self): 
     line = ser.readline() 
     if len(line) > 2: 
      global globvar 
      globvar = line 

而且在我的第二個I類有:

class MyFrame(wx.Frame): 
    def OnMove(self, event): 
     pos = event.GetPosition() 
     global globvar 
     self.posCtrl.SetValue("%s, %s" % (globvar, pos.y)) 

這些都在同一個文件中。錯誤文本是:

Traceback (most recent call last): 
    File "C:\Program Files (x86)\wxPython2.8 Docs and Demos\samples\mainloop\mainloop.py", line 66, in OnMove 
    self.posCtrl.SetValue("%s, %s" % (globvar, pos.y)) 
NameError: global name 'globvar' is not defined 
+0

,因爲你已經在你的主腳本宣佈它的變量已經全球。在你的問題中沒有任何代碼或回溯,所以很難猜測你實際上遇到了什麼問題。 – kindall

回答

2

所有參數都通過引用傳遞(在C++意義上)。雖然可以通過複製來模擬Python語言,但是Python語言沒有通過值傳遞(在C++意義上),並且某些事情會自動複製爲像數字,字符串和元組一樣的變異,以便它們可以使外觀已被傳遞按價值。非常具體的python是call-by-object(又名共享呼叫,逐個對象引用),前面已經指出了在stackoverflow上的here

要創建一個變量全局,您需要在任何函數之外進行首次賦值,或者使用全局關鍵字創建一個函數。要在函數中修改它,您還需要使用全局關鍵字。有關全球keyword的更多詳情,請參閱此處。

例如:

i = 0 
print i 
class A(object): 
    global i 
    i = 1 
print i 
class B(object): 
    def Foo(self): 
     global i 
     i = 2 
b = B() 
b.Foo() 
print i 

產生的輸出:

0 
1 
2 
+0

你能舉一個例子說明如何將它傳遞給這個類,然後使它成爲所有類都可以訪問的變量? – NickHalden

+0

它希望它是全球性的,沒有必要先將它傳遞給類,類可以像其他任何類一樣訪問它。 –

+0

添加了代碼示例。 –

相關問題