Python类中的变量列表

时间:2014-05-02 00:58:05

标签: python python-2.7

这是我的第一个问题,并且结合我的相当noob随时告诉我是否有一个完全不同的方式我应该去做这个!

无论如何,我正在构建一个程序,它涉及使用Python 2.7中的四色定理着色地图,尝试尽可能多地使用某些颜色,并且在运行类似代码时遇到了问题:

在一个模块中:

class state:
    a = 0
    b = 0
    variable_list = [a,b]

然后我将该模块导入我的主程序:

from State import state  //State(uppercase "s") is the .py file with the state class in it

instance = state()

instance.a = 1

print instance.variable_list[0]

...并且程序打印0,尽管在主程序中更改它。有关如何使用更改更新instance.variable_list的任何想法?

4 个答案:

答案 0 :(得分:2)

你必须从指针的角度来考虑Python变量。您的问题归结为以下几点:

>>> a = 42
>>> l = [a]
>>> a = 0
>>> print l[0]  # shouldn't this print 0?
42

答案是否定的,因为重新分配a与列表l无关。该列表包含指向内存中某些对象的指针。 l[0]碰巧指向与a相同的对象(int 42)。当我们重新分配a时,我们只需要它"指向"到内存中的新对象(int 0)。这与列表l无关。

看起来像这样:

a = 42
l = [a]

                      +----+
            a  -----> | 42 | <------ l[0]
                      +----+

a = 0

                      +----+
            l[0] ---> | 42 |
                      +----+

                      +---+
            a ------> | 0 |
                      +---+

请注意l[0]未发生变化。

答案 1 :(得分:2)

我会切入我认为你想要做的事情。

class State(object):
    def __init__(self):
        self.a = 0
        self.b = 0
    @property
    def variable_list(self):
        return self.a, self.b

和用法:

state = State()

state.a = 1

state.variable_list
Out[23]: (1, 0)

您的代码值得注意的更改:

  • 您正在抓取State的实例,因此请创建属性 instance 属性,而不是类属性。我怀疑你希望State的每个实例共享相同的属性。
  • @property decorator使得你可以访问variable_list,就像它是一个常规属性一样,但你可以自定义它返回的行为 - 在这种情况下,是一些实例属性。
  • object继承以获得"new-style"课程。相信我,现在基本上没有理由使用旧式的课程。
  • 命名约定。类以大写字母开头。

答案 2 :(得分:0)

当你更新变量a时,它不会更新那个实例,只是简单地用一个完全不同的指针赋予它一个不同的int。因此,此更改不会像您预期的那样反映列表中的更改。

您可以在列表中添加update方法:

def update():
    variable_list = [a,b]

并在每次更新变量时调用它。

或者,您可以简单地使用字典并取消个别变量:

class state:
    variables = {'a': 0, 'b': 1}

x = state()
print x.variables['a']

x.variables['a'] = 1
print x.variables['a']

[OUTPUT]
0
1

答案 3 :(得分:0)

我们来看看你的课程代码。

class state:
    a = 0
    b = 0
    variable_list = [a,b]

a变为0,b变为0.因此,列表“variable_list”变为[0,0]。 然后,您继续使用此代码更改a:

instance.a = 1

哪个有效。对象实例变量确实是1.但是,variable_list仍然是[0,0]!该列表仍然是原始值,因为列表本身没有更改。您运行以生成列表的代码只运行一次。要解决此问题,您可以根据a和b的当前值(而不是原始值)创建一个更新variable_list的函数。例如,您可以创建一个函数来更新变量列表,如下所示:

def updateVariableList(self):
    variable_list = [self.a, self.b]

当您使用instance.updateVariableList()调用该函数时,它将根据a和b的当前值更新列表的值。现在print instance.variable_list [0]将显示更新的值。