Python命名空间和全局变量

时间:2012-11-14 17:02:27

标签: python namespaces global

我已经阅读了几个关于使变量全局化并在具有class.var功能的类之间共享它们的答案,但这些似乎都不适用于我的示例。

我只有一个文件:app.py实例化多个类。但是,我想要创建全局变量不在类中,它只是在主脚本中。然后当我在其中一个类中的函数中键入全局globvar时,我得到错误:`

NameError: global name 'globvar' is not defined.

如何通过引用将此变量传递给类(我知道,而不是pythonic语言),以便类可以修改它,但其他类可以访问它,或者使其全局化,以便所有类都可以访问它? / p>

编辑文件底部没有缩进:

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

然后在我的第一堂课中我有:

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

在我的第二堂课中,我有:

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

1 个答案:

答案 0 :(得分:2)

所有参数都通过引用传递(在C ++意义上)。 Python语言没有传递值(在C ++意义上),虽然它可以通过复制来模拟,并且某些东西会自动复制到像数字,字符串和元组这样的变体上,这样它们可能会给出已经传递的外观按价值。非常具体的python是call-by-object(也称为call-by-sharing,call-by-object-reference),正如之前在stackoverflow上指出的那样here

要使变量成为全局变量,您需要在任何函数之外对其进行第一次赋值,或者使用global关键字在函数中创建。要在函数中修改它,您还需要使用global关键字。有关全局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