绕过不可变的字符串python

时间:2013-01-03 12:06:43

标签: python

好的,我开始编码:

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字符串(和整数)是不可变的......

那我怎么绕过?

3 个答案:

答案 0 :(得分:8)

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

lastentry = "something"

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

请注意,如果您正在使用全局值进行读取,则不需要执行此操作,就像在第三个函数中一样。但是如果你分配给一个变量,它被视为其作用域的局部 - 通常是周围的函数 - 如果你没有明确地声明它是全局的(或者在python3中是非本地的)。

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

答案 1 :(得分:1)

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

你可能想写,而不是你问题中的代码:

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

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

另外,正如l4mpi所提到的,在修改它的方法中需要global lastentry

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

答案 2 :(得分:1)

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

那就是说,lastcall看起来是随机的,如果它可能是lastentry