1

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

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

NameError: global name 'globvar' is not defined.

我怎样才能通过引用将此变量传递给类(我知道,不是pythonic语言),以便类可以修改它但其他类可以访问它,或者使它成为全局以便所有类都可以访问它?

编辑没有缩进的文件底部:

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
4

1 回答 1

2

所有参数都通过引用传递(在 C++ 意义上)。Python 语言没有按值传递(在 C++ 意义上),尽管它可以通过复制来模拟,并且某些东西会自动复制到 mutate 上,比如数字、字符串和元组,这样它们可能会看起来像是被传递了按价值。具体来说,python 是按对象调用(也称为按共享调用,按对象引用调用),如前面在 stackoverflow 上指出的那样。

要使变量成为全局变量,您需要在任何函数之外对其进行第一次赋值,或者使用 global 关键字在函数中创建。要在函数中修改它,您还需要使用 global 关键字。有关 global关键字的更多详细信息,请参见此处。

例如:

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
于 2012-11-14T17:12:06.413 回答