我在Python(2和3)中挣扎于这种奇怪的行为:
>>> a = [1, 2]
>>> a[a.index(1)], a[a.index(2)] = 2, 1
这导致:
>>> a
[1, 2]
但如果你写
>>> a = [1, 2]
>>> a[a.index(1)], a[a.index(2)] = x, y
其中x, y != 2, 1
(可以是1, 1
,2, 2
,3, 5
等),这会导致:
>>> a == [x, y]
True
正如人们所料。为什么不a[a.index(1)], a[a.index(2)] = 2, 1
生成结果a == [2, 1]
?
>>> a == [2, 1]
False
答案 0 :(得分:10)
因为它实际上被解释为:
>>> a = [1, 2]
>>> a
[1, 2]
>>> a[a.index(1)] = 2
>>> a
[2, 2]
>>> a[a.index(2)] = 1
>>> a
[1, 2]
引用,根据standard rules for assignment(强调我的):
- 如果目标列表是以逗号分隔的目标列表:对象必须是具有与目标相同数量的项目的可迭代项 在目标列表中,项目已分配,从左到右,分配到 相应的目标。
a[a.index(1)]
(即a[0]
)的作业发生之前第二次作业请求a.index(2)
,到时a.index(2) == 0
。
您将看到任何作业的相同行为:
foo = [a, b]
foo[foo.index(a)], foo[foo.index(b)] = x, y
其中x == b
(在这种情况下,右侧第一个值为2
的任何赋值)。