为什么多变量赋值可实现排序算法元素交换,逐行赋值却无法生效
排序算法中多变量赋值可完成元素交换、逐行赋值失效的原因
逐行赋值失效的核心原因
逐行赋值的写法会提前覆盖丢失其中一个元素的原始值:
if a_list[i] > a_list[i+1]: a_list[i] = a_list[i+1] a_list[i+1] = a_list[i]
实际运行场景举例:假设当前a_list[i] = 3,a_list[i+1] = 2
- 执行第一行赋值
a_list[i] = a_list[i+1]后,a_list[i]被覆盖为2,原始的3已经永久丢失 - 执行第二行赋值
a_list[i+1] = a_list[i]时,读取到的a_list[i]已经是修改后的2,最终两个元素都会变成2,交换自然无法完成。
如果一定要用逐行赋值实现交换,新增一个临时变量存储原始值即可:
if a_list[i] > a_list[i+1]: # 先存储原始值 temp = a_list[i] a_list[i] = a_list[i+1] a_list[i+1] = temp
多变量赋值生效的原理
Python的多变量赋值执行逻辑是先计算右侧所有值,再统一赋值给左侧变量,不会出现中途覆盖原始值的问题:
if a_list[i] > a_list[i+1]: a_list[i], a_list[i+1] = a_list[i+1], a_list[i]
还是以上述a_list[i]=3、a_list[i+1]=2`的场景为例:
- 第一步先计算等号右侧的
a_list[i+1]和a_list[i],得到两个原始值2和3,打包为临时元组(2, 3) - 第二步把临时元组的两个值依次赋值给左侧的
a_list[i]和a_list[i+1]
整个过程不会丢失原始值,所以可以顺利完成交换。
参考完整冒泡排序代码
def bubble_sort(a_list): last_ind = len(a_list) - 1 flag = True while flag: flag = False for i in range(0, last_ind): if a_list[i] > a_list[i+1]: a_list[i], a_list[i+1] = a_list[i+1], a_list[i] flag = True return a_list a_list = [5,8,2,1] print(bubble_sort(a_list))
内容的提问来源于stack exchange,提问作者Preston_Jarvis
相关产品推荐
相关产品推荐

