当我正在阅读关于Bubble排序算法的图书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)但问题是,书中提供的代码的缩短版本是什么?正在进行什么样的手术?我不懂这里的语法。在书的前几章里找不到。
提前感谢!
发布于 2021-04-23 18:23:50
代码与缩短代码之间唯一的区别是这一行:
l[i], l[i+1] = l[i+1], l[i]它所做的是一次分配两个对象。例如,
a, b = c, d同时分配a = c和b = d。
这不仅限于变量赋值,还适用于for -循环:
for index, item in enumerate(lst):这将同时迭代索引和项。
最后要注意的一点是,您一次可以分配超过两个。
a, b, c = 1, 2, 3会像预期的那样工作。
因此,这段缩短的代码简单地同时分配l[i] = l[i+1]和l[i+1] = l[i],从而消除了定义临时变量的额外行的需要。
发布于 2021-04-23 18:25:32
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]https://stackoverflow.com/questions/67235067
复制相似问题