<p>每当<code>cardNum</code>随机值为0、11、12或13时,就为<code>cardNum</code>变量指定一个字符串值。你知道吗</p>
<p>当您在<code>cardNum</code>变量设置为<code>"king"</code>之后访问<code>Clubs</code>列表时,您实际上是这样做的:</p>
<pre><code>Clubs["king"] # Invalid access (str as list index)
</code></pre>
<p>只能以整数(0、1、2等)访问列表索引,也只能访问列表中填充的索引(有效索引)。你知道吗</p>
<p>因为指定字符串值是为了打印,所以应该使用另一个变量来存储卡名,如下所示:</p>
<pre class="lang-py prettyprint-override"><code>def dealPlayer():
cardSuit = random.randrange(1, 5) #Decide card suit#
if cardSuit == 1:
cardNum = random.randrange(0, 14) # Decide card number [0,14), upper exclusive
if cardNum == 11:
cardName = "jack"
elif cardNum == 12:
cardName = "queen"
elif cardNum == 13:
cardName = "king"
elif cardNum == 0:
cardName = "ace"
else:
cardName = cardNum
print ("Your first card is the", cardName, "of clubs.")
Clubs.remove(cardNum)
</code></pre>
<p>这样就不会有任何问题,因为<code>cardNum</code>保持不变,是一个整数。还要注意,更改为<code>Clubs.remove(cardNum)</code>。这是从列表中删除项目的正确方法。你知道吗</p>
<h2>编辑</h2>
<p>这里的逻辑也是有缺陷的:一旦你从列表中删除了“三个俱乐部”(在你的例子中,如果<code>0</code>是ace,那么列表中的“三个俱乐部”后面的所有卡片都会减少一个索引。这意味着如果你期望你在索引<code>4</code>上的对象是“四个俱乐部”的话,它实际上就是“五个俱乐部”,因为所有的东西都会被降低一个。你需要改变你的设计来考虑这个问题。你知道吗</p>