0

わかりました、私はこれをコーディングし始めました:

lastentry = 'first'
campdata = {'a1'=0,
            'b2'=0}

class Someclass:
      def on_window1_destroy(self, widget, data=None):
           print campdata

      def func1(self)
          lastentry = 'b2'

      def func2(self)
          lastentry = 'a1'

      def func2(self)
          campdata[lastcall] +=1

しかし、その後、Python 文字列 (および整数) が不変であることがわかりました...

では、どうすれば回避できますか?

4

3 に答える 3

8

あなたの問題は、 orlastentryを呼び出してグローバル変数の値を変更したいということだと思いますが、うまくいきません。機能しない理由は、変数がグローバルスコープにあり、関数内で同じ名前に割り当てると、グローバル変数と同じ名前のローカル変数が作成されるためです。グローバル変数に割り当てるには、次のように宣言する必要があります。func1func2

lastentry = "something"

def func1():
    global lastentry #tell python to treat references to lastentry as global
    lastentry = "somethingelse"

グローバル値で行っているのが3 番目の関数のように読み取るだけの場合は、これを行う必要がないことに注意してください。しかし、変数に割り当てた場合、明示的にグローバル (または python3 では非ローカル) と宣言しないと、そのスコープ (通常は周囲の関数) に対してローカルとして扱われます。

グローバル変数は、コードが複雑になるため、必要な場合にのみ使用してください。あなたの場合、コードをリファクタリングして、グローバル変数の代わりに lastentry にインスタンス変数またはクラス変数を使用することができます。

于 2013-01-03T12:13:42.967 に答える
1

コードに問題はありません (一部の詳細を除く)。ここでは、文字列の不変性は問題ではないようです。

質問のコードの代わりに、次のように書くこともできます。

campdata = {'a1': 0,  # Not "= 0"
            'b2': 0}

campdata[lastentry] +=1  # not "lastcall"

global lastentryまた、l4mpi が述べたように、変更するメソッドにa が必要です。

もう 1 つのポイント: グローバル変数に依存することは非常に珍しいことです。可能であれば、インスタンス属性 ( self.campdataself.lastentry) を使用することをお勧めします。

于 2013-01-03T12:09:18.447 に答える
1

他の人が言ったように、コード内の文字列を変更しようとする試みはないように見えるので、それはほとんど問題ではありません.

そうは言っても、lastcallランダムに見えますが、おそらくそうでしょうlastentryか?

于 2013-01-03T12:09:51.150 に答える