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

我猜你的问题是你想lastentry通过调用func1or来改变全局变量的值func2,这是行不通的。它不起作用的原因是因为变量在全局范围内,并且在函数内部分配相同的名称只会创建一个与全局变量同名的局部变量。要分配给全局变量,您需要将其声明为:

lastentry = "something"

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

请注意,如果您对全局值所做的所有操作都是像在第三个函数中那样读取它,则您不需要这样做。但是,如果您分配给一个变量,则它被视为其范围的本地 - 通常是周围的函数 - 如果您没有明确声明它是全局的(或在 python3 中是非本地的)。

全局变量只应在必要时使用,因为它们会增加代码的复杂性。在您的情况下,您可能可以重构代码以使用实例变量或类变量作为 lastentry 而不是全局变量。

于 2013-01-03T12:13:42.967 回答
1

我看不出你的代码有任何问题(除了一些细节)。在这里,字符串不变性似乎不是问题。

您可能想要编写,而不是问题中的代码:

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

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

此外,正如 l4mpi 所提到的,您需要global lastentry在修改它的方法中使用 a 。

还有一点:依赖全局变量是很不寻常的。如果可能的话,最好使用实例属性(self.campdata, self.lastentry)。

于 2013-01-03T12:09:18.447 回答
1

就像其他人所说的那样,似乎没有任何尝试修改代码中的字符串,所以这几乎不是问题。

也就是说,lastcall看起来是随机的,应该是lastentry吗?

于 2013-01-03T12:09:51.150 回答