1

変数をグローバルにし、class.var 機能を使用してクラス間で変数を共有することに関するいくつかの回答を読みましたが、私の例ではそれらのどれも機能していないようです。

app.py複数のクラスをインスタンス化するファイルは 1 つだけです。ただし、グローバルにしたい変数はクラスではなく、メイン スクリプトにあるだけです。次に、いずれかのクラス内にある関数にグローバル 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

そして、2番目のクラスでは次のことを行います。

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 はオブジェクトごとの呼び出し (別名、共有による呼び出し、オブジェクト参照による呼び出し) であり、以前にスタックオーバーフローで指摘されています

変数をグローバルにするには、最初の代入を関数の外で行うか、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 に答える