搜索 python 代码短片的解释,冒泡排序

in search for explanation of short snippet of python code, bubble sort

当我阅读 Python 研讨会这本书时,关于冒泡排序算法的主题,我看到了这段代码:

l = [5, 8, 1, 3, 2]
still_swapping = True
while still_swapping:
    still_swapping = False
    for i in range(len(l) - 1):
        if l[i] > l[i+1]:
            l[i], l[i+1] = l[i+1], l[i]
            still_swapping = True

我理解代码的前提,一个一个地比较值并按正确的顺序替换它们,我不明白这里发生了什么:

l[i], l[i+1] = l[i+1], l[i]

当然,我可以自己写这样的代码,这里是我的初学者版本:

l = [5, 8, 1, 3, 2]
still_swapping = True
while still_swapping:
    still_swapping = False
    for i in range(len(l) - 1):
        if l[i] > l[i+1]:
            temp = l[i]
            l[i] = l[i+1]
            l[i+1] = temp
            still_swapping = True

print(l)

但问题是,书中提供的代码的简化版本是什么?正在进行什么样的操作?我不明白这里的语法。在书的前几章还真找不到。

提前致谢!

您的代码与缩短的代码之间的唯一区别是这一行:

l[i], l[i+1] = l[i+1], l[i]

它的作用是一次分配 2 个对象。例如,

a, b = c, d

同时赋值a = cb = d

这不仅限于变量赋值,它也适用于 for 循环:

for index, item in enumerate(lst):

这将同时遍历索引和项目。

最后要注意的是,您一次可以分配 2 个以上。

a, b, c = 1, 2, 3

将按预期工作。

所以这个缩短的代码只是同时分配 l[i] = l[i+1]l[i+1] = l[i],因此不需要额外的一行来定义临时变量。

l[i+1], l[i] 在右侧创建两个索引值的匿名二元组。元组拆包让您可以将元组扩展为左侧的变量。就像 foo, bar = 1, 2 一样,创建的元组中的值被扩展到左侧 l[i], l[i+1]。效果是列表的两个值被交换了。

您可以通过分配该临时元组来查看正在运行的交换。

>>> l = [1,2]
>>> i = 0
>>> tmp = l[i+1], l[i]
>>> print(tmp)
(2, 1)
>>> l[i], l[i+1] = tmp
>>> print(l)
[2, 1]