为什么在函数内修改列表不会改变列表?

Why the modifications of a list inside a function do not change the list?

我正在编写一个程序来从给定的排序列表中删除重复的元素。我编写了函数 "removeDuplicates" 来对列表进行一些修改,并在函数末尾打印更新后的列表。由于列表是通过引用传递的,问题是为什么更改不适用于函数外的列表。

def removeDuplicates(nums):
    c = 0
    nums = nums + [nums[-1] + 1]  # add a dummy element to the end of the list
    for i in range(len(nums) - 1):
        if nums[i] != nums[i + 1]:
            nums[c] = nums[i]
            c = c + 1
    nums.pop()
    print(nums)

if __name__ == "__main__":
    nums = [1, 1, 1, 2, 2, 3, 4, 4, 4, 5, 5]
    removeDuplicates(nums)
    print(nums)

您的问题所在行:

nums = nums + [nums[-1] + 1]

因为您正在将 nums 重新分配给新值。相反,尝试:

nums.append(nums[-1] + 1)

这样,您就地更改了 nums 的值,这意味着您在整个函数中仍然引用同一个对象,而不是创建一个新对象.

nums = nums + [nums[-1] + 1]  # add a dummy element to the end of the list

错了。您专门从 nums 和您的新元素创建一个 new 列表,然后使您的局部变量 nums 指向该新列表。然后你在新列表上很好地操作并退出函数而不保存结果。

尝试

nums.append(nums[-1] + 1)  # add a dummy element to the end of the list

输出:

[1, 2, 3, 4, 5, 3, 4, 4, 4, 5, 5]

这是因为如果你在 removeDuplicates 中的第二行:

nums = nums + [nums[-1] + 1]  # add a dummy element to the end of the list

这会创建一个通过引用传递的列表参数 nums 的新副本,并且您的重复数据删除操作会修改副本而不是原始列表。

你的函数还有其他问题,没有那一行我得到输出:

>>> nums = [1, 1, 1, 2, 2, 3, 4, 4, 4, 5, 5]
>>> removeDuplicates(nums)
[1, 2, 3, 4, 2, 3, 4, 4, 4, 5]

看看这个优秀的答案以获得更好的方法:

如其他答案中所述,问题出在您添加虚拟元素时。您正在创建 nums 变量的新副本。为避免这种情况,您可以使用此处建议的 np.append() 方法或简单地替换

nums = nums + [nums[-1] + 1]  

nums += [nums[-1] + 1]  

这样您就不会创建新列表。