我有一个列表,我需要将列表中的第一个元素与列表中的最大元素交换。
但是为什么代码1工作而代码2没有:
代码1:
a = list.index(max(list))
list[0], list[a] = list[a], list[0]
代码2:
list[0], list[list.index(max(list))] = list[list.index(max(list))], list[0]
我认为Python会先将右侧评估,然后再将其分配给左侧的名称?
答案 0 :(得分:5)
Python将结果存储在从左到右的多个目标中,按顺序执行赋值目标表达式。
所以你的第二个版本基本上归结为:
temp = list[list.index(max(list))],list[0]
list[0] = temp[0]
list[list.index(max(list))] = temp[1]
请注意,{/ 1}}在 list.index(max(list))
被更改后执行,并且您刚刚存储了最大值。
Assignment statements documenation:
中记录了这一点
- 如果目标列表是以逗号分隔的目标列表:该对象必须是一个可迭代的项目数与目标列表中的目标相同,并且项目已分配,从左到右,到相应的目标。
从那时起,就好像每个目标都是一个目标一样,所以后面的文档从左到右适用于每个目标:
将对象分配给单个目标按递归方式定义如下。
[...]
- 如果目标是订阅:评估引用中的主表达式。它应该产生可变序列对象(例如列表)或映射对象(例如字典)。接下来,评估下标表达式。
如果您更改了代码的分配顺序:
list[0]
因为现在list[list.index(max(list))], list[0] = list[0], list[list.index(max(list))]
已分配给第一个。