为啥多变量赋值适用于快速排序算法但不适用于逐行赋值?

Posted

技术标签:

【中文标题】为啥多变量赋值适用于快速排序算法但不适用于逐行赋值?【英文标题】:Why does multiple variable assigment work for a quick sort algorithm but not for line by line assignment?为什么多变量赋值适用于快速排序算法但不适用于逐行赋值? 【发布时间】:2022-01-05 11:34:48 【问题描述】:

基本上试图理解为什么为快速排序实现进行多变量分配有效,如下所示:

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] 值。之后再做a_list[i+1] = a_list[i] 是没有意义的,因为你正在分配刚刚来自a_list[i+1] 的值。实际交换值需要使用临时变量或 Python 相当独特的 A, B = B, A 【参考方案1】:

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

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

【讨论】:

谢谢,这是我试图了解的关于 Python 幕后操作的不太明显的部分。我认为它们在某种程度上是等价的。 Java中不也是这样吗?因此,基本上,当我们进行多变量赋值时,它会创建临时内存来进行交换,而第二个版本正在更改值,然后更改正在更改的第二个值。是不是多变量赋值是即时的,而第二个例子是手动的?【参考方案2】:

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)

【讨论】:

【参考方案3】:

例子

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

将修改a_list 中索引i 处的值,然后将索引i + 1 设置为该修改后的值。你可以把多重赋值语法想象成 Python 同时做两个赋值,所以一个赋值不会影响另一个。

【讨论】:

多个赋值不会同时发生是相当重要的。具体来说,这就是为什么它甚至可以工作:保证首先评估右手边。 我想我无法理解为什么将两个值同时设置到右侧与您所说的不同。 @MisterMiyagi 我想我现在理解得更好了,不是同时/同时发生,而是在存储数据的地方出现了一种临时存储器在一个元组中为第一个变量赋值而不改变另一个变量。如此有效地警告第一个对第二个分配没有影响,因为两个操作的元组中都有临时内存?对吗? @MisterMiyagi 我想在该操作完成索引后, a_list[i] 和 a_list[i+1] 将指向临时元组数据 [i+1] 和临时元组数据 [我] 恭敬地。好奇这是否会创建数据的深拷贝或浅拷贝?

以上是关于为啥多变量赋值适用于快速排序算法但不适用于逐行赋值?的主要内容,如果未能解决你的问题,请参考以下文章

AutoLayout 适用于 UIView 但不适用于 UILabel。为啥?

为啥 jQuery 选择器适用于 Chrome,但不适用于 Safari?

我的突变适用于 Amplify,但不适用于 Apollo。为啥?

为啥析取赋值运算符 |= 不适用于布尔向量?

GET 请求适用于 Postman,但为啥它不适用于 ReactJS fetch?

Ajax 加载面板适用于 FF,但不适用于 Chrome。知道为啥吗?