这个以逗号分隔的 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)
这会在一行中完成工作,而无需创建另一个列表。
我正在查看 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)
这会在一行中完成工作,而无需创建另一个列表。