<分区>
我目前正在学习 Python,我遇到了一个与列表赋值相关的问题。
在
def nextPermutation(self, nums: List[int]) -> None:
...
我有一行代码将列表反转如下:
nums = nums[::-1]
但是测试平台将其标记为不正确,而
nums[:] = nums[::-1]
没问题。
我怀疑是因为我正在创建另一个 nums
列表对象,而传入的原始列表没有改变,对吗?
标签 python python-3.x
<分区>
我目前正在学习 Python,我遇到了一个与列表赋值相关的问题。
在
def nextPermutation(self, nums: List[int]) -> None:
...
我有一行代码将列表反转如下:
nums = nums[::-1]
但是测试平台将其标记为不正确,而
nums[:] = nums[::-1]
没问题。
我怀疑是因为我正在创建另一个 nums
列表对象,而传入的原始列表没有改变,对吗?
最佳答案
如果您了解 C 语言和指针,您可以将 nums
想象成一个指向列表的指针。
考虑这种情况:
def reverse(nums):
nums = nums[::-1]
my_list = [1, 2, 3]
reverse(my_list)
赋值 nums = nums[::-1]
相当于在内存中创建一个新列表(元素颠倒),并更改指针 nums
指向那个新列表。但是由于您更改的变量 nums
是函数的本地变量,因此此更改不会影响作为参数传递的外部变量,如下图所示:
现在考虑这种情况:
def reverse(nums):
nums[:] = nums[::-1]
my_list = [1, 2, 3]
reverse(my_list)
赋值 nums[:] = nums[::-1]
相当于在 nums
指向的相同地址处写入一个新的反向列表 ,因为切片允许用新内容替换列表的一部分(尽管在这种情况下“部分”是整个列表)。
在这种情况下,您不会更改变量 nums
,而是更改它指向的数据。如下图所示:
请注意,实际上 python 中的所有变量在这个答案中使用的意义上都是“指针”,但只有列表和字典允许替换“就地”一些内容(它们是可变数据类型)。对于任何其他类型(不可变),您无法更改内存中的数据,因此您所能做的就是像第一种情况一样“重新分配指针”,这就是函数无法更改作为参数接收的数据的原因,除了对于列表案例。
关于python - nums[:] = nums[::-1] 和 nums = nums[::-1] 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57152755/