奇怪的内联分配

时间:2015-11-03 13:37:46

标签: python tuples variable-assignment

我在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, 12, 23, 5等),这会导致:

>>> a == [x, y]
True

正如人们所料。为什么不a[a.index(1)], a[a.index(2)] = 2, 1生成结果a == [2, 1]

>>> a == [2, 1]
False

1 个答案:

答案 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的任何赋值)。