Python手写快速排序返回结果正确但第二次打印原列表异常,求原因
问题原因
- Python中列表属于可变对象,函数传参时传递的是列表的内存引用而非独立副本,调用
Quick(xxx)时,函数内的List变量初始和外部xxx指向同一个列表对象。 - 你代码中的双指针交换逻辑
List[l_idx], List[r_idx] = List[r_idx], List[l_idx]执行时,会直接修改当前List指向的原列表(也就是外部的xxx)的元素顺序,这一步修改是实时生效到外部列表的。 - 后续
List = Quick(List[0: (l_idx)]) + [List[l_idx]] + Quick(List[(l_idx + 1):])只是给函数内的局部变量List重新绑定了一个新拼接的列表对象,这个操作不会覆盖外部xxx的指向,但之前交换步骤对原列表的修改已经无法撤销,所以最终打印xxx得到的是被中间步骤修改后的乱序列表。
修复方案
如果希望调用函数不修改原列表,可以在函数入口先创建原列表的副本,所有操作都在副本上执行:
def Quick(List): # 先拷贝生成独立副本,后续操作不影响原列表 List = List.copy() if len(List) <= 1: return List pivot = List[0] l_idx = 0 r_idx = len(List) - 1 while l_idx != r_idx: while List[l_idx] < pivot and l_idx < r_idx: l_idx += 1 while List[r_idx] > pivot and l_idx < r_idx: r_idx -= 1 if l_idx < r_idx: List[l_idx], List[r_idx] = List[r_idx], List[l_idx] List = Quick(List[0: (l_idx)]) + [List[l_idx]] + Quick(List[(l_idx + 1):]) return List
内容的提问来源于stack exchange,提问作者QF2QP
相关产品推荐
相关产品推荐

