为什么对函数内部的列表进行修改不会更改列表?

问题描述 投票:-1回答:4

我正在编写一个程序,从给定的排序列表中删除重复的元素。我编写了函数“ 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)
python list pass-by-reference
4个回答
2
投票
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]

3
投票

您的问题已解决:

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

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

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

这样,您将更改nums in place的值,这意味着您在整个函数中仍在引用同一对象,而不是创建新对象。


0
投票

这是因为如果您在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]

看看这个出色的答案,寻求更好的方法:https://stackoverflow.com/a/7961390/11776945


0
投票

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

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

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

这样,您将不会创建新列表。

© www.soinside.com 2019 - 2024. All rights reserved.