这与Multiple assignment and evaluation order in Python 的问题基本相同,只是由于复杂的索引而产生了表面皱纹。
这里要记住的事情:
在完全评估左侧之前先完全评估右侧
从左到右完全评估元组分配
文档在此处(尽管很少)说明了这一点:https://docs.python.org/3/reference/expressions.html#evaluation-order
Python 从左到右计算表达式。请注意,在评估分配时,右侧会先于左侧进行评估。
我在这里说明适用于您的情况的这些规则:
State of a Evaluation of expression Comment
[-1, 4, 3, 1] a[1], a[a[1]-1] = a[a[1]-1], a[1] <start>
[-1, 4, 3, 1] a[1], a[a[1]-1] = a[4-1], a[1] a[1] resolves to 4
[-1, 4, 3, 1] a[1], a[a[1]-1] = a[3], a[1] 4-1 is 3
[-1, 4, 3, 1] a[1], a[a[1]-1] = 1, a[1] a[3] resolves to 1
[-1, 4, 3, 1] a[1], a[a[1]-1] = 1, 4 a[1] resolves to 4
[-1, 1, 3, 1] a[a[1]-1] = 4 a[1] = 1 assigned
[-1, 1, 3, 1] a[1-1] = 4 a[1] resolves to 1
[-1, 1, 3, 1] a[0] = 4 1-1 is 0
[4, 1, 3, 1] a[0] = 4 assigned