2012-11-14 164 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

添加了代码示例。 –

相关问题