Python数字列表旋转代码异常:输出重复列表问题求助
问题分析与解决方案
嘿,我来帮你搞清楚这个问题的根源~
你遇到的问题是因为列表是可变对象,当你执行A.append(N)的时候,并没有把当前N的内容复制一份存到A里,而是把N这个列表的引用添加到了A中。也就是说,A里的所有元素其实都指向同一个列表对象。后续你对N做的pop(0)和append(y)操作,都是在修改这个同一个列表,所以最后打印A的时候,所有元素显示的都是这个列表最终的状态(也就是回到初始的[1,9,7])。
解决方案1:添加列表副本到结果中
修改你的函数,每次添加到A的时候,创建一个当前N的副本(而不是引用)。同时建议不要直接修改传入的原始列表,避免意外改变外部数据:
def rotation(N): A = [] # 先复制一份传入的列表,避免修改原始参数 temp_list = N.copy() for _ in range(len(N)): # 执行旋转操作 first_element = temp_list.pop(0) temp_list.append(first_element) # 添加当前列表的副本到结果中 A.append(temp_list.copy()) return A K = [1,9,7] r = rotation(K) print(r) # 输出: [[1, 9, 7], [9, 7, 1], [7, 1, 9]]
解决方案2:用切片更简洁地实现旋转
其实可以不用pop和append,直接通过列表切片来生成旋转结果,这种方式更简洁,而且天然生成新列表,不会有引用问题:
def rotation(N): # 循环len(N)次,每次生成一个旋转后的新列表 return [N[i:] + N[:i] for i in range(len(N))] K = [1,9,7] r = rotation(K) print(r) # 输出: [[1, 9, 7], [9, 7, 1], [7, 1, 9]]
这里的逻辑是:N[i:]取从索引i到末尾的子列表,N[:i]取从开头到索引i的子列表,两者拼接起来就是一次左旋转后的结果,循环所有可能的起始索引,就能得到所有旋转情况。
内容的提问来源于stack exchange,提问作者Layla
相关产品推荐
相关产品推荐

