Python嵌套循环中如何存储元素交换后生成的新数组
嵌套循环交换列表元素时无法保存新生成状态的解决方法
问题核心成因
Python的列表属于可变对象,直接用赋值语句将列表绑定给新变量时,传递的是列表的内存引用,而非当前时刻的元素值副本。所有指向同一块内存的变量,在后续对原列表做交换、还原操作时,看到的始终是内存最终的内容——也就是循环结束后被还原回初始值的列表,之前临时交换生成的状态根本没有被独立存储下来。
对应原代码中的具体问题点:
- 原代码中
NEWstate = alist的写法没有生成独立副本,仅给原列表加了一个变量别名 - 每次循环完成两次交换后,列表会被还原为交换前的状态,所有别名指向的内容最终都是还原后的初始值
- 原代码中预先定义的空状态列表
NEW=[]始终没有执行追加操作,本身也不具备留存状态的能力
正确存储的实现方式
要留存每次交换后的独立状态,必须在完成元素交换的时刻,对当前列表做值拷贝,再把拷贝结果存入状态集合,不能直接存储原列表的引用。
常见的列表拷贝可选写法:
- 浅拷贝(适用于无嵌套元素的一维列表):
列表名.copy()、列表名[:]、list(列表名) - 深拷贝(适用于嵌套结构的复杂列表):通过
copy.deepcopy()生成完全独立的副本
修正后的完整可运行代码
def genrState(alist): NEW = [] print("Current state ", alist) i = 0 for x in alist: print("for", x, "index is ", i) j = i for y in alist[i+1:]: if i < 10: # 执行元素交换 alist[i], alist[j+1] = alist[j+1], alist[i] print("generated", alist) # 关键:拷贝当前列表的独立副本存入集合,避免引用同步变化 NEWstate = alist.copy() NEW.append(NEWstate) print("NEW INSIDE", NEWstate) # 还原列表状态,准备下一轮交换 alist[i], alist[j+1] = alist[j+1], alist[i] j = j + 1 i = i + 1 print("NEW", NEW) print(alist) a = [2,1,5,0] genrState(a)
修正后的运行效果
所有临时交换生成的状态都会以独立副本的形式存入NEW列表,后续的列表还原操作不会影响已经存储的历史状态,最终可以完整留存所有循环生成的不同交换结果。
内容的提问来源于stack exchange,提问作者Azizul Hakim Nabid
相关产品推荐
相关产品推荐

