1
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 行实际上只是将列表条目更改为“ taken ”,而不是将条目引用的“warrior”变量更改为“ taken ”。有没有办法做到这一点?

原谅魔兽参考。

4

4 回答 4

3

You want to use dictionaries instead:

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

or:

taken = dict.fromkeys(('warrior', 'mage', 'warlock', 'paladin'), False)
names = {character: character.capitalize() for character in taken}

then pick a random character:

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

You really do not want to use separate local identifiers to represent a group of characters, that only complicates matters.

于 2013-04-04T12:11:21.760 回答
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]

有关可变性的更多信息,请参阅:
不可变与可变类型
在 Python 中哪些是不可变的?
http://stsdas.stsci.edu/pyraf/python_quick_tour.html#PyMutability

于 2013-04-04T12:30:15.007 回答
0

我会选择两组,untaken并且taken,因为这似乎与顺序无关。

因此,您可以选择成员并在集合之间移动它们,例如

import random
taken = set()
untaken = set(['Mage','Warlock','Warrior','Paladin'])
chosen = random.sample(untaken,1)
taken.add(chosen)
untaken.remove(chosen)
于 2013-04-04T13:13:26.907 回答
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)

于 2013-04-04T12:33:38.897 回答