我已经阅读了几个关于使变量全局化并在具有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
答案 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