Python如何更改列表中引用的变量

时间:2013-04-04 12:06:14

标签: python list

import random
warrior = 'Warrior'
mage = 'Mage'
warlock = 'Warlock'
paladin = 'Paladin'
firstList = [warrior, mage, warlock, paladin]
print(firstList[0], firstList[1], firstList[2], firstList[3])
firstNumber = random.randint(0, 3)
firstList[firstNumber] = '*taken*'
print(firstList[0], firstList[1], firstList[2], firstList[3])
secondList = [paladin, warlock, mage, warrior]
print(secondList[0], secondList[1], secondList[2], secondList[3])

假设随机数选择0 我意识到第9行实际上只是将列表条目更改为“ take ”,而不是将条目引用的“warrior”变量更改为“ take ”。有没有办法做到这一点?

原谅魔兽世界的参考资料。

4 个答案:

答案 0 :(得分:3)

您想要使用词典:

taken = {'warrior': False, 'mage': False, 'warlock': False, 'paladin': False}
names = {'warrior': 'Warrior', 'mage': 'Mage', 'warlock': 'Warlock', 'paladin': 'Paladin'}

或:

taken = dict.fromkeys(('warrior', 'mage', 'warlock', 'paladin'), False)
names = {character: character.capitalize() for character in taken}
然后选择一个随机字符:

from random import choice
picked = choice(list(names.keys()))
taken[picked] = True
print('Picked:', names[picked])

你真的不想使用单独的本地标识符来表示一组字符,这只会使问题复杂化。

答案 1 :(得分:1)

使用您当前的技术无法做到这一点。我建议在Martijn Pieters的回答中使用这种技术。

只是为了解释为什么你不能这样做:

您的变量是所有string个对象,它们是不可变的(如Peter Wood所述)。无法更改不可变的方法 - 当您更改变量时,您正在创建一个新对象。如果你使用可变类型做同样的事情,那么这将是可能的

>>> list_1 = []
>>> list_2 = []
>>> main_list = [list_1, list_2]
>>> main_list[1].append(5)
>>> print(list_2)
[5]

有关可变性的更多信息,请参阅:
Immutable vs Mutable types
Which of these are immutable in Python?
http://stsdas.stsci.edu/pyraf/python_quick_tour.html#PyMutability

答案 2 :(得分:0)

为什么不使用面向对象的方法?

from random import choice

class Character(object):
    def __init__(self, name, taken=False):
        self.name = name
        self.taken = taken
    def get_taken(self):
        self.taken = True
    def __repr__(self):
        return self.taken and '{} (taken)'.format(self.name) or self.name


class Team(list):
    def take_someone(self, number=None):
        if number is None:
            choice(self).get_taken()
        else:
            self[number].get_taken()


myTeam = Team([Character("Warrior"),
               Character("Mage"),
               Character("Warlock")])
print myTeam

[战士,法师,术士]

myTeam.take_someone()

print myTeam

[战士,法师,术士(采取)]

现在你甚至可以将一个角色初始化为“taken”,你可以让你的myTeam对象选择一个使用myTeam.take_someone()的随机角色,或者你可以选择字符索引。例如myTeam.take_someone(0)

答案 3 :(得分:0)

我选择了两套untakentaken,因为这似乎是订单无关紧要的事情。

所以你要选择成员并在集合之间移动它们,比如

import random
taken = set()
untaken = set(['Mage','Warlock','Warrior','Paladin'])
chosen = random.sample(untaken,1)
taken.add(chosen)
untaken.remove(chosen)