Это потому, что аргументы в левой части присваивания по-прежнему оцениваются слева направо. Давайте разберем нерабочий пример:
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
становится
nums[i], nums[nums[i]-1] = nums[0], nums[1]
становится
nums[i], nums[nums[i]-1] = 0, 1
теперь вычисляется левая часть, но nums[i]
оценивается первым. Это превращает nums[1]
в 0
.
Теперь, если мы оценим nums[nums[i] - 1]
, мы увидим, что это дает nums[0 - 1]
, то есть nums[-1]
, то есть nums[1]
.
Так что все это выражение ничего не делает. Он просто устанавливает nums[1]
на 0
, а затем обратно на 1
.