Python 2适配Python 3.14时Mazo类eliminaCarta方法误删列表首元素问题排查
嘿,这个问题我一眼就看出症结所在了——你在Carta类的比较魔法方法里犯了两个关键错误,直接导致list.remove()找错了元素!让我给你拆解清楚:
问题根源
比较方法返回值不符合Python规范
Python要求__eq__、__lt__、__gt__这类魔法方法必须返回布尔值(True/False),但你的代码里返回的是1或-1。在Python的布尔判断逻辑里,任何非零整数都会被视为True,这就导致carta in self.cartas的判断彻底失效——所有元素都会被判定为和目标carta相等,所以remove()会直接删掉列表的第一个元素,而非你指定的那一张。__eq__的匹配逻辑不完整
你当前的__eq__只比较了牌的数值,但一张牌的唯一性应该由花色+数值共同决定。就算你修复了返回值问题,只比数值也会导致同数值不同花色的牌被误判为相同。Mazo类的小笔误
你的__contains__方法里写的是return item in self.items,但Mazo类根本没有items属性,应该是self.cartas(这个笔误在这里影响不大,但最好修正以避免后续其他问题)。
修复方案
把Carta类的比较方法改成符合Python规范的写法,同时修正Mazo的笔误:
import random class Carta: listaDePalos = ["Tréboles", "Diamantes", "Corazones", "Picas"] listaDeValores = ["nada", "As", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Sota", "Reina", "Rey"] def __init__(self, palo=0, valor=0): self.palo = palo self.valor = valor def __str__(self): return (self.listaDeValores[self.valor] + " de " + self.listaDePalos[self.palo]) def __lt__(self, other): # 先比较花色 if self.palo < other.palo: return True if self.palo > other.palo: return False # 花色相同,处理As的优先级(As为最大牌) if self.valor == 1: # self是As,比任何非As牌都大,因此self不小于other return False if other.valor == 1: # other是As,self不是,因此self更小 return True # 都不是As,直接比较数值 return self.valor < other.valor def __gt__(self, other): # 复用__lt__和__eq__的逻辑,避免重复代码 return not self.__lt__(other) and not self.__eq__(other) def __eq__(self, other): # 花色和数值完全相同才是同一张牌 return self.palo == other.palo and self.valor == other.valor class Mazo: def __init__(self): self.cartas = [] for palo in range(4): for valor in range(1, 14): self.cartas.append(Carta(palo, valor)) def muestraMazo(self): for carta in self.cartas: print(carta) def __str__(self): s = "" for i in range(len(self.cartas)): s = s + " "*i + str(self.cartas[i]) + "\n" return s def mezclar(self): nCartas = len(self.cartas) for i in range(nCartas): j = random.randrange(i, nCartas) self.cartas[i], self.cartas[j] = self.cartas[j], self.cartas[i] def __contains__(self, item): # 修正笔误:self.items → self.cartas return item in self.cartas def eliminaCarta(self, carta): if carta in self.cartas: self.cartas.remove(carta) return 1 else: return 0
测试验证
现在你再运行测试代码:
carta_objetivo = Carta(1,13) # Rey de Diamantes mazo = Mazo() mazo.eliminaCarta(carta_objetivo) # 检查是否正确删除 for carta in mazo.cartas: if str(carta) == "Rey de Diamantes": print("Error: 目标牌还在!") break else: print("成功删除目标牌!")
这次就会精准删除你指定的Rey de Diamantes,再也不会误删第一张牌了。
内容的提问来源于stack exchange,提问作者Matias Alvarez
相关产品推荐
相关产品推荐

