python - nums[:] = nums[::-1] 和 nums = nums[::-1] 之间的区别

标签 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 是函数的本地变量,因此此更改不会影响作为参数传递的外部变量,如下图所示:

bad

现在考虑这种情况:

def reverse(nums):
   nums[:] = nums[::-1]

my_list = [1, 2, 3]
reverse(my_list)

赋值 nums[:] = nums[::-1] 相当于在 nums 指向的相同地址处写入一个新的反向列表 ,因为切片允许用新内容替换列表的一部分(尽管在这种情况下“部分”是整个列表)。

在这种情况下,您不会更改变量 nums,而是更改它指向的数据。如下图所示:

right

请注意,实际上 python 中的所有变量在这个答案中使用的意义上都是“指针”,但只有列表和字典允许替换“就地”一些内容(它们是可变数据类型)。对于任何其他类型(不可变),您无法更改内存中的数据,因此您所能做的就是像第一种情况一样“重新分配指针”,这就是函数无法更改作为参数接收的数据的原因,除了对于列表案例。

关于python - nums[:] = nums[::-1] 和 nums = nums[::-1] 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57152755/

相关文章:

python - 重建一扇 window

python - Paramiko/加密弃用警告 : CryptographyDeprecationWarning: encode_point has been deprecated on EllipticCurvePublicNumbers

python - 有人可以帮助澄清我对 syncdb 和导入循环的困惑, 'Do you have to be explicit on imports?'

python - 如何检查 conda develop 是否安装了我的项目/包?

python - Python-Rocksdb的安装

python - 如何使用多处理在Python中运行多个异步进程?

python - 如何用pylab画一颗心

python - 列出编辑距离矩阵中的非对角值

python - 如何删除第一级索引,然后将剩余的索引值与 pd DataFrame 的自定义逻辑合并?

python - 通过从现有列中过滤来创建新变量