这个以逗号分隔的 Python 行是否创建了一个元组?

Is this comma-separated Python line creating a tuple?

我正在查看 this LeetCode problem, (basically, we need to remove all instances of a given value in an array, without creating or using another array) and I came across this particular solution 的不同讨论:

def removeElement(self, nums, val):
  start, end = 0, len(nums) - 1
  while start <= end:
      if nums[start] == val:
          nums[start], nums[end], end = nums[end], nums[start], end - 1
      else:
          start +=1
  return start

我不明白这一行发生了什么:

nums[start], nums[end], end = nums[end], nums[start], end - 1

我不熟悉这种逗号语法。我在 Python 文档和 Stack Overflow 中进行了搜索,了解到在 Python 中,用逗号分隔元素会产生一个元组,但对于我来说,我不明白这是否是正在发生的事情在这里,因为“新创建的元组”没有被分配给任何东西(那里甚至有一个赋值语句)。除非这与元组无关,并且这里完全发生了其他事情。

我想帮助理解这一行。

nums[start], nums[end], end = nums[end], nums[start], end - 1 赋值的右侧确实创建了一个元组。左侧直接解包元组。如果你将它分成两个作业,也许它更容易理解:

# create a tuple: (nums[end], nums[start], end - 1)
atuple = nums[end], nums[start], end - 1

# unpack the tuple into: nums[start], nums[end], end
nums[start], nums[end], end = atuple

# To make it more clear, here's an example using basic values
another_tuple = 1, 2, 3

# unpack the tuple -> a = 1, b = 2, c = 3
a, b, c = another_tuple

具有多个值的赋值实际上会在内部为正确的部分创建临时变量。但是,当在左侧部分使用索引时,您必须考虑接收变量的顺序。这会使逻辑有点棘手(例如,end 索引变量的赋值必须放在最后,以便在前两个容器的索引中使用它的先前值)

可以使用一个更简单的方案,将整个列表的内容分配给迭代器的值:

 nums[:] = (n for n in nums if n != val)

这会在一行中完成工作,而无需创建另一个列表。