You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python数组提取奇偶索引元素最优方案及卡牌游戏代码报错排查

解决卡牌分配问题:修复报错并实现最优方案

首先咱们先搞定你遇到的报错问题,再聊聊最顺手的实现方式。

为什么会出现'NoneType' object is not subscriptable报错?

你代码里这行是核心问题:

deck = random.shuffle(deck)

random.shuffle()是原地修改列表的函数,它本身不会返回新列表,返回值是None。你把这个None赋值给了deck,直接把原本的卡牌列表覆盖成了空值,后面调用函数时试图对None做切片操作,自然就报错了。

修复超简单,去掉赋值,直接调用shuffle就行:

random.shuffle(deck)

你的filter用法为啥不对?

filter()的正确用法是先传一个判断函数,再传可迭代对象,它会筛选出让判断函数返回True的元素。但你直接传了deck[::2],完全不符合它的参数逻辑——而且你根本不需要用filter,Python的列表切片就能完美解决你的需求。

最优实现方案

你的需求是玩家1拿偶数索引(0、2、4…)的卡牌,玩家2拿奇数索引(1、3、5…)的卡牌,用切片就能一步到位,甚至不需要额外写函数(当然要封装也没问题)。

完整修正后的代码

import random

colours = ['RED', 'BLACK', 'YELLOW']
# 注意:randint(1,30)才会生成1-30的编号,你之前写的31会包含31哦
deck = [(random.randint(1, 30), random.choice(colours)) for _ in range(30)]
# 原地打乱卡组,不要赋值
random.shuffle(deck)
print("打乱后的完整卡组:", deck)

# 用切片直接分配,简洁高效
player1_cards = deck[::2]  # 从索引0开始,步长2,取所有偶数索引的卡牌
player2_cards = deck[1::2] # 从索引1开始,步长2,取所有奇数索引的卡牌

print("\n玩家1的卡牌:", player1_cards)
print("玩家2的卡牌:", player2_cards)

可选:封装成可复用函数

如果需要把分配逻辑封装成函数方便复用,写法也很直观:

def get_player_cards(deck, player_number):
    if player_number == 1:
        return deck[::2]
    elif player_number == 2:
        return deck[1::2]
    else:
        raise ValueError("玩家编号只能是1或2")

# 使用示例
player1 = get_player_cards(deck, 1)
player2 = get_player_cards(deck, 2)

内容的提问来源于stack exchange,提问作者Rapha Nash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:28:23