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

2024-10-17 08:30:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个程序,从给定的排序列表中删除重复的元素。我编写了函数“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)

Tags: the函数程序add元素列表if排序
3条回答

因为如果你在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

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

错了。您可以从nums和新元素创建一个新的列表,然后使局部变量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]

你的问题是:

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

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

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

这样,您就可以就地更改nums的值,这意味着您在整个函数中仍然引用同一个对象,而不是创建新对象。你知道吗

相关问题 更多 >