为什么我的列表在函数外没有更新?当传入函数时,python列表不是通过赋值调用的吗?

zlwx9yxi  于 2023-04-22  发布在  Python
关注(0)|答案(1)|浏览(157)

我无法通过很多this problem的测试用例。我运行了函数以及法官将用于在我的本地机器上测试函数的代码,发现问题在于当调用nums时,nums不会在函数removeDuplicates()外部更新,而是在函数内部更新。为什么会这样?Aren't python列表在传入函数时通过赋值调用?

def removeDuplicates(nums):
    nums_ = set(nums)
    nums = []
    for i in nums_:
        nums.append(i)
    print(nums)
    # not working even if I do nums = list(set(nums)) instead of all lines above
    return len(nums)

nums = [1,1,2]
expectedNums = [1,2]

k = removeDuplicates(nums)
if k != len(expectedNums):
    print(False)
for i in range(k):
    if nums[i] != expectedNums[i]:
        print(False)
        print(nums, expectedNums)
        break

输出:

错误[1,1,2]
[1、2]
之前我使用了nums = list(set(nums)),而不是清空列表并追加所有唯一元素,但即使这样也不起作用。

z2acfund

z2acfund1#

线路:

nums = []

重新绑定局部变量nums,使其不再指向最初传入的列表,而是指向新创建的列表。
如果您执行以下操作:

nums.clear()

那么你是在改变原始列表而不是创建一个新列表。
请记住,=操作符重新绑定变量,而不是修改变量引用的对象。
Obligatory Ned Batchelder link.
注意,[] =下标赋值也允许你改变一个列表(因为你没有给变量赋值,而是给变量引用的对象中的索引或切片赋值)。你可以很简单地把你的函数写为:

def removeDuplicates(nums):
    nums[:] = set(nums)  # you can slice-assign into a list from a set!
    print(nums)
    return len(nums)

相关问题