Python卡牌洗牌方法问题:嵌套列表被填充为空列表
问题:Python嵌套列表未填充有效数据,仅为空列表
我有Java开发背景,正在学习Python,编写了一个表示扑克牌组的类,其中包含mergeshuffle方法,该方法通过将卡牌拆分为x个堆、反转堆的顺序后从第y堆开始合并来实现洗牌。
目前遇到的核心问题是:嵌套列表stackholder未被填充有效数据,仅被填充了空列表;已测试多数输入输出,其他模块功能符合预期。
相关代码
def mergeshuffle(self, x, y): if x > len(self.cards): print("Invalid input. Try again using an integer value 1-52") return elif x < 0: print("Invalid input. Try again using an posotive integer value 1-52") return stacks = int(len(self.cards)/x) cardsinstack = int(len(self.cards)/stacks) print(str(stacks) +" <- stacks cards in stack -> " + str(cardsinstack)) counter = 0 stackholder = [] for i in range(stacks): thisstack = [] for x in range(cardsinstack): thisstack.append(self.cards[counter]) #print (" Added " + str(thisstack[x])) #print(str(counter)) counter=counter+1 thisstack.reverse() stackholder.append(thisstack) thisstack.clear() print(str(stackholder)) #print((str(stackholder)).center(10, '&') )
相关输出关键内容
52 playing cards total. 13 <- stacks cards in stack -> 4 [[], [], [], [], [], [], [], [], [], [], [], [], []]
我期望该嵌套列表的每个子列表长度为4,按顺序包含对应分组的卡牌。已调试程序中其他变量,未发现异常,寻求问题原因及解决办法。
问题原因及解决办法
问题原因
你在把thisstack添加到stackholder后调用了thisstack.clear()。Python里列表是可变对象,stackholder.append(thisstack)存的是对thisstack的引用,不是新列表的副本。所以清空thisstack时,stackholder里的子列表也会跟着变空——它们指向的是同一个内存对象。
另外代码里还有个小坑:内层循环用x当循环变量,覆盖了方法参数的x,容易引发逻辑错误,建议换个变量名(比如_或card_idx)。
解决办法
有两种简单修复方式:
- 直接移除
thisstack.clear():因为每次外层循环都会重新初始化thisstack = [],根本不需要手动清空,这步操作完全多余。 - 添加列表副本到
stackholder:如果一定要保留清空操作(比如后续复用变量),就存副本而非原引用:stackholder.append(thisstack.copy()) # 或者用 thisstack[:] 创建切片副本 thisstack.clear()
内容的提问来源于stack exchange,提问作者Andre Frank
相关产品推荐
相关产品推荐

