繁体   English   中英

类中的Python变量列表

[英]Python list of variables inside a class

这是我的第一个问题,再加上我是个菜鸟,请随时告诉我是否有完全不同的方式来解决这个问题!

无论如何,我正在构建一个程序,该程序涉及在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的任何想法?

您必须根据指针来考虑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]尚未更改。

我会简化为我想您想做的

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的实例,因此使属性成为实例属性,而不是类属性。 我怀疑您是否希望State每个实例共享相同的属性。
  • @property装饰器使之成为可能,因此您可以像访问常规variable_list一样访问variable_list ,但是可以自定义其返回值的行为-在这种情况下,是几个实例属性。
  • object继承以获得“新样式”类。 相信我,现在基本上没有理由使用老式类了。
  • 命名约定。 类以大写字母开头。

当您更新变量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

让我们看一下您的类代码。

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

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

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的当前值更新列表的值。 现在打印instance.variable_list [0]将显示更新的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM