为什么多变量分配适用于快速排序算法但不适用于逐行分配?

Why does multiple variable assigment work for a quick sort algorithm but not for line by line assignment?

基本上试图理解为什么为快速排序实现进行多变量赋值会起作用,如下所示:

if a_list[i] > a_list[i+1]:
    a_list[i], a_list[i+1] = a_list[i+1], a_list[i]

但不是一行一行地做,像这样:

if a_list[i] > a_list[i+1]:
    a_list[i] = a_list[i+1]
    a_list[i+1] = a_list[i]

如果有帮助的话,这里是完整的代码:

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))

例子

a_list[i] = a_list[i+1]
a_list[i+1] = a_list[i]

将修改 a_list 中索引 i 处的值,然后将索引 i + 1 设置为修改后的值。您可以将多重赋值语法视为 Python 同时执行两个赋值,因此一个赋值不会影响另一个。

在第一个实现中,在幕后 python 将创建一个元组来存储两个变量的值,然后更改变量的值。

a_list[i]的值改变后的第二次实现中,之前的值丢失了,所以无法将a_list[i+1]设置为正确的值。

a, b= 1, 2。本质上,它进行元组拆包,以便为左侧(元组)的值分配右侧(元组)对应元素的值。

例如上面的考试意味着 (a, b) = (1, 2) 这反过来意味着 a=1b=2

现在假设 a=5 和 `b=10'

a = 5
b = 10

# Right method
a, b = b, a    # same as saying (a, b) = (10, 5) and thus assigning a = 10 and b = 5

# Wrong method
a = b        # a is now assigned 10
b = a        # a is 10 from the previous line, and b is now assigned 10

我不会说第一种方法是即时的,而第二种方法是手动的,而是它们做两种不同的事情。其中之一是将一个值元组(碰巧存储在变量中)解包成一个变量元组,而另一个我猜是错误的变量赋值。

使第二种方法起作用的一种方法是

c = a   # new variable stores value of a
a = b   # a is reassigned to the value of b
b = c   # b is now reassigned to the original value of a (which was previously stored in c)