在Python中,为什么函数参数在函数调用之间保持其值

在Python中,为什么函数参数在函数调用之间保持其值,python,Python,我对Python还相当陌生,我无法对我得到的结果了如指掌 使用以下代码: def func(a,b=set()): res=list() for i in a: if i not in b: res.append(i) b|={i} return res print(func([1,1,2,2,3,4])) print(func([1,1,2,2,3,4])) 我得到了输出: [1,2,3,4] []

我对Python还相当陌生,我无法对我得到的结果了如指掌 使用以下代码:

def func(a,b=set()):
    res=list()
    for i in a:
        if i not in b:
            res.append(i)
            b|={i}
    return res

print(func([1,1,2,2,3,4]))
print(func([1,1,2,2,3,4]))
我得到了输出:

[1,2,3,4]
[]
我把“print(b)”放在“res=list()”上面,得到了输出:

set()
[1,2,3,4]
{1,2,3,4}
[]

发生了什么事?调用函数时,不应该将“b”设置为“set()”吗?在Python中使用Python3.6的Im函数是对象,参数被计算并执行一次。这是一个很好的解释:

在您的示例中,可以通过以下操作“修复”:

def func(a,b=None):
    if b is None:
        b = set()
    res=list()
    for i in a:
        if i not in b:
            res.append(i)
            b|={i}
    return res
查看默认参数的设置:

默认值仅计算一次。当默认值是可变对象(如列表、字典或大多数类的实例)时,这会有所不同

使用默认参数定义函数时,仅当解释器首次执行定义时(实际
def
语句),才会计算默认值。这通常不是问题,除非使用可变的默认值。也就是说,一个可以在适当的地方修改的

在您的情况下,当您第一次调用函数时修改函数中的
b
时,它会在下次调用时保留该值。为了避免这种情况,您可以这样做:

def func(a,b=None):
    if b is None:
        b = set()
    res=list()
    for i in a:
        if i not in b:
            res.append(i)
            b|={i}
    return res

现在
b
将始终具有所需的默认值。

在第一个函数调用中,b为空 看这里

在第二个函数调用中,b已经填充了元素

因此,如果我不在b中,则此条件不会运行
,并返回空列表

试试这个

def func(a):
    res=list()
    b=set()
    for i in a:
        if i not in b:
            res.append(i)
            b|={i}
    return res

print(func([1,1,2,2,3,4]))
print(func([1,1,2,2,3,4]))
输出

[1,2,3,4]

[1,2,3,4]


阅读重要警告herehttps://docs.python.org/3/tutorial/controlflow.html#default-参数值