我有一个“for”循环不适用于列表

问题描述 投票:0回答:1

我正在尝试制作一款 Uno 游戏,而且我几乎是 Python 的初学者。所以我制作了 5 个定义所有卡片的列表(yellow_cards、red_cards、blue_cards、green_cards、wild_cards)并创建了一个类

班级看起来像这样:

class card:
  def __init__(self, color, number):
    self.color = color
    self.number = number

然后我尝试定义所有卡片颜色(我也不确定该范围是否有效)

for uno_card in red_cards:
  uno_card = card("red", range(1,12))
for uno_card in yellow_cards:
  uno_card = card("yellow", range(1,12))
for uno_card in blue_cards:
  uno_card = card("blue", range(1,12))
for uno_card in green_cards:
  uno_card = card("green", range(1,12))

然后我测试了它:

print(red1.color)

(red1 是“red_cards”中的卡片之一),我收到此错误

AttributeError                            Traceback (most recent call last)
<ipython-input-8-9ed3b2018f1f> in <cell line: 32>()
---> 32 print(red1.color)
AttributeError: 'str' object has no attribute 'color'
python
1个回答
0
投票

查看您的错误消息,您似乎将

red1
放在引号中,如下所示
"red1"
。你可以这样解决问题:

red1 = card("red", 1)
print(red1.color)

我发现的另一件事是,你的 uno_card 变量在每个循环中都会被覆盖,因此它与最终的 for 循环具有相同的效果,这并不理想。

我注意到的另一件事是您在 for 循环中使用的范围生成器,这可能会在将来引起问题。卡的“数字”实际上是一个生成器对象!由于您可能还不知道生成器是什么,因此您可以将其视为一个列表,但具有延迟加载(完整和用法定义位于https://wiki.python.org/moin/Generators)。所以你的代码

for uno_card in red_cards:
  uno_card = card("red", range(1,12))
for uno_card in yellow_cards:
  uno_card = card("yellow", range(1,12))
for uno_card in blue_cards:
  uno_card = card("blue", range(1,12))
for uno_card in green_cards:
  uno_card = card("green", range(1,12))

将被 Python 解释器视为类似的内容:

for uno_card in red_cards:
  uno_card = card("red", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
for uno_card in yellow_cards:
  uno_card = card("yellow", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
for uno_card in blue_cards:
  uno_card = card("blue", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
for uno_card in green_cards:
  uno_card = card("green", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

您似乎正在尝试填充列表。

您可以通过列表理解来做到这一点,正如@Barmar所说:

red_cards = [card("red", i) for i in range(1, 12)]
yellow_cards = [card("yellow", i) for i in range(1, 12)]
blue_cards = [card("blue", i) for i in range(1, 12)]
green_cards = [card("green", i) for i in range(1, 12)]

这也解决了我发现的第二个问题,所以现在您可以通过列表访问每张卡。

希望这有帮助(这是我的第一个答案)!

© www.soinside.com 2019 - 2024. All rights reserved.