Python列表追加后同步修改问题求助:保留初始列表状态
解决列表追加后原列表修改导致已存元素同步变化的问题
你遇到的问题本质是Python中可变对象的引用特性:列表是可变类型,当你把a追加到b里时,并没有复制列表内容,而是把a指向的内存地址存到了b中。后续修改a(或通过swap函数修改a指向的列表),其实是在修改同一块内存里的内容,所以b里的第一个元素也会跟着变化。
下面提供两种可行的解决办法:
方法一:追加时存入列表的副本
在第一次将a加入b时,不要直接存原列表,而是存入它的副本,让b中的元素和后续修改的a成为两个独立的列表。Python创建列表副本的常用方式有三种:
- 使用
list.copy()方法:b.append(a.copy()) - 切片语法:
b.append(a[:]) list()构造器:b.append(list(a))
修改后的完整代码:
def func(m,n,l,t): a=[i for i in range(m)] b=[] b.append(a.copy()) # 存入列表副本 a=swap(a) b.append(a) for i in b: print(i) def swap(l): i,n=0,len(l) while(i<n-1): # 修正索引越界问题(若m为奇数时,i+1会超出范围) l[i],l[i+1]=l[i+1],l[i] i+=2 return l
方法二:让swap函数返回新列表而非修改原列表
修改swap函数,不直接修改传入的列表,而是先创建副本,对副本执行交换操作后返回。这样原列表a不会被改动,后续赋值的a是新列表,和b中已存入的初始列表互不干扰。
修改后的swap函数:
def swap(l): new_l = l.copy() # 创建输入列表的副本 i,n=0,len(new_l) while(i<n-1): new_l[i],new_l[i+1]=new_l[i+1],new_l[i] i+=2 return new_l
此时原func函数无需修改,直接调用即可得到期望输出。
两种方法执行后,都会输出你想要的结果:
[0, 1, 2, 3, 4, 5, 6, 7] [1, 0, 3, 2, 5, 4, 7, 6]
内容的提问来源于stack exchange,提问作者ubelo
相关产品推荐
相关产品推荐

