Python 使用列表访问变量引用

Python 使用列表访问变量引用,python,Python,我正在用python制作一个civclicker类型的游戏,它要求我在食物变量变为负值时杀死工人 目前,我考虑使用的方法是在列表上使用random.choice,我想知道是否可以让列表包含对变量的引用 以下是我的功能: self.maxPopulation = 0 self.workers = 0 self.farmers = 0 self.miners = 0 self.loggers = 0 def random_killer(self, amount): for i in ran

我正在用python制作一个civclicker类型的游戏,它要求我在食物变量变为负值时杀死工人

目前,我考虑使用的方法是在列表上使用random.choice,我想知道是否可以让列表包含对变量的引用

以下是我的功能:

self.maxPopulation = 0
self.workers = 0
self.farmers = 0
self.miners = 0
self.loggers = 0

def random_killer(self, amount):
    for i in range(round(amount)):
        choice = []
        choice += [self.farmers] * self.farmers + [self.miners] * self.miners + [self.loggers] * self.loggers + [self.workers] * self.workers
        chosen = random.choice(choice)
        chosen -= amount
因此,这显然不起作用,因为生成的
选择
列表只是一个数字数组。我还制作了
self.farmers
等文本字符串,并使用了exec函数(该函数不起作用),但我知道使用exec/eval是一种不好的做法

另一个需要考虑的问题是将所有内容都放到字典中,但这需要对代码进行更全面的检查——我将在其他一些基本系统就位后再进行检查

忽略这一点-我很好奇你是否可以将对
self.farmers
等变量的引用存储在列表中,而不是传递数字

因此,我的问题是:您能否将指向某个变量的引用或指针(例如,
self.farmers
)存储在列表中,以便将引用传递给另一个变量,
selected
,从而允许我动态编辑
self.farmers

编辑:

增加了一些细节<代码>自我。农民/矿工/伐木工人/工人是指每个类别的人数

上面的函数应该创建一个列表,该列表是通过引用上述变量,然后将引用变量的数量乘以该变量表示的数量来创建的。所以从某种意义上说,如果我们有5个农民,我们会得到一个类似于
[self.farmers,self.farmers,self.farmers,self.farmers,self.farmers]
的列表


在人工意义上,列表中的每个项目代表游戏中的一个人,当他们被选中时,这个人就会被杀死。实际上,它只是对同一变量的若干引用,然后在选择时按任意数量减少。

使用字典可能会更容易。为了简洁起见,我将在类外演示它,但它很容易成为实例属性(并且可以通过属性或
\uuuu getattr\uuu
将值作为属性公开):

请注意,您可能希望在
for
循环中减去
1
,而不是
金额


要仅对属性执行此操作,请使用
getattr
setattr
,并将属性名称存储在
选项中:

class Population(object):

    OCCUPATIONS = ('miners', 'workers', 'farmers', 'loggers')

    def __init__(self):
        self.miners = 1
        self.workers = 2
        self.farmers = 3
        self.loggers = 4

    def kill_random(self, n):
        for _ in range(n):
            choices = [attr for attr in self.OCCUPATIONS
                       for _ in range(getattr(self, attr))]
            occupation = random.choice(choices)
            setattr(self, occupation, getattr(self, occupation)-1)
使用中:

>>> a = Population()
>>> a.kill_random(3)
>>> a.miners
0
>>> a.workers
2
>>> a.farmers
1
>>> a.loggers
4

您只提供了一个孤立实例方法,如果没有上下文,它就没有多大用处。您能否提供一个例子,清楚地说明您正在尝试做什么,以及您当前的方法是如何失败的?您是否试图从多个列表中分割的多个人中随机选择一个人,但根据列表的长度进行加权?@jornsharpe-请参见编辑。你已经接近我的意思了——抱歉把它弄混了。我想选择一个随机变量(从可能的4个变量中——农民、矿工、伐木工人和工人,每个变量都引用一个数字),根据它们所代表的数字进行加权。这肯定是我正在考虑做的事情,也可能是我最后要做的事情。但我想知道是否可以存储对变量的引用,从而避免使用字典。不感兴趣。@Scironic查看编辑-基本相同,但使用
setattr
getattr
>>> a = Population()
>>> a.kill_random(3)
>>> a.miners
0
>>> a.workers
2
>>> a.farmers
1
>>> a.loggers
4