Python列表排序出现意外结果,仅操作目标列表却修改了原列表
问题原因
Python中的列表属于可变对象,执行sortedList = numList的操作时,并没有生成新的列表副本,只是给内存中同一个列表对象绑定了第二个变量名。两个变量指向完全相同的内存地址,后续你调用的sort()方法本身是原地修改列表的方法(不会生成新的列表对象),所以无论通过哪个变量名修改列表,作用的都是同一个对象,最终表现就是原列表同步被修改。
解决方案
可任选以下任意一种方案实现仅排序新列表、不改动原列表的需求:
- 方案1:使用列表切片生成浅拷贝
将赋值语句修改为sortedList = numList[:],切片操作会生成独立的新列表对象,对新列表的修改不会同步到原列表。
示例代码:def sorted_demo(numList): print(numList) sortedList = numList[:] sortedList.sort() print(numList) print(sortedList) - 方案2:使用
list()构造函数生成新列表
赋值语句改为sortedList = list(numList),同样会生成原列表的浅拷贝,修改新列表不影响原列表。 - 方案3:直接使用
sorted()内置函数(推荐)
Python内置的sorted()函数会直接返回排序后的新列表,完全不会修改原列表,不需要额外手动拷贝,代码更简洁:def sorted_demo(numList): print(numList) sortedList = sorted(numList) print(numList) print(sortedList) - 方案4:使用copy模块实现浅拷贝
针对更复杂的使用场景,可以导入copy模块实现显式拷贝:import copy sortedList = copy.copy(numList)
内容的提问来源于stack exchange,提问作者Danny Tang
相关产品推荐
相关产品推荐

