You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么多变量赋值可实现排序算法元素交换,逐行赋值却无法生效

排序算法中多变量赋值可完成元素交换、逐行赋值失效的原因

逐行赋值失效的核心原因

逐行赋值的写法会提前覆盖丢失其中一个元素的原始值:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:06:07