Python二维列表生成异常:循环添加随机修改列表后所有行重复
问题分析与解决方案
核心问题:列表引用导致内容重复
你遇到的问题根源是列表属于可变对象,每次向macierz添加的都是同一个podlista的引用。后续对podlista的修改会同步影响所有已添加到macierz的元素,最终所有行都指向最后一次修改后的列表,因此内容完全一致。
额外优化点
import random放在循环内会重复导入模块,应移到代码开头。- 内层
for k in range(n)逻辑不合理:该循环会从索引0到n-1逐个执行交换,相当于每行执行了x*n次交换,远超过你设定的x次单行交换次数。
修正后的代码
import random n = 4 m = 4 x = 2 original_podlista = [0, 0, 1, 1] def swapPositions(lst, pos1, pos2): # 更简洁高效的交换方式,替代pop+insert lst[pos1], lst[pos2] = lst[pos2], lst[pos1] return lst macierz = [] for w in range(m): # 每次生成新行时复制原始列表,确保每行是独立对象 podlista = original_podlista.copy() # 执行x次随机交换 for y in range(x): # 随机选取两个位置进行交换 pos1 = random.randint(0, n-1) pos2 = random.randint(0, n-1) swapPositions(podlista, pos1, pos2) macierz.append(podlista) print(macierz)
关键修改说明
- 用
original_podlista.copy()创建新列表副本,保证每行都是独立的对象,修改操作不会互相影响。 - 将
import random移至代码开头,避免重复导入模块的冗余操作。 - 调整交换逻辑:内层循环仅执行
x次随机交换,匹配你设定的x为单行交换次数的需求。 - 简化
swapPositions函数,利用Python的多变量赋值特性完成交换,比pop+insert更高效简洁。
内容的提问来源于stack exchange,提问作者slow
相关产品推荐
相关产品推荐

