Python3 - 更改传入变量的引用

Python3 - Change reference of passed in variable

我有一个关于如何在 python 中正确构造具有副作用的函数的问题。

假设我有这样的代码,应该从列表中删除出现的数字:

def removeNumber(nums, val):
    nums = [num for num in nums if num != val]

如果我然后像这样从函数外部使用此代码:

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
removeNumber(my_list, 4)

print(my_list)

my_list 保持不变,因为 nums 只是内存中的一个插槽,它曾经指向与 my_list 相同的列表,但是在我的新分配指向一个看起来我喜欢的方式。

我该如何更改 my_list 以指向我刚刚创建的新列表?

我知道引用 nums[n] 会转到内存中的实际列表,但我发现这有点笨拙。谢谢!

如果我没有正确理解你的问题,

def removeNumber(nums, val):
    nums = [num for num in nums if num != val]
    return nums

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
my_list = removeNumber(my_list, 4)

只需 return 函数中的新列表并用它重新分配列表。

试试这个:

def removeNumber(nums, val):
    nums[:] = [num for num in nums if num != val]

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
removeNumber(my_list, 4)

print(my_list)

这样您修改的是列表元素,而不是列表本身。

说明

假设你有一些关于Python对象的基本知识,你基本上在调用函数时创建了对列表的第二个引用(第一个引用是mylist)。所以 nums 指向同一个对象。当你像原来那样做时,你让 nums 指向新的表达式,例如你的列表理解。所以原始列表保持不变。

当您使用 [:] 语法时,两个指针仍指向同一个对象,但您修改的是列表的元素,而不是列表本身。您可以通过查看对象 ID 对此进行一些试验。