hahaazhixcn 2021-05-26 21:23 采纳率: 100%
浏览 98
已采纳

Python中的函数的参数传入怎么理解(多次重复自定义函数后参数的变化)?

def func(x=[],y=[6,7]):
    print('x:',x)
    print('y:',y)
    x.append(8)
    y.append(8)
    print('x:',x)
    print('y:',y)
    return(x+y)
a,b=[1,2],[3,4]
t=func(x=a)
print(t)
t=func(y=b)
print(t)
t=func()
print(t)
如题,为什么最后一步的输出结果是[8,8,6,7,8,8]

x=a和y=b为什么没有使[1,2]和[3,4]传入呢

  • 写回答

4条回答 默认 最新

  • CSDN专家-kaily 2021-05-27 08:53
    关注

    将列表作为函数的默认参数是python的一个坑。简单来说就是在第一次使用默认列表参数时,会创建一个默认值,并且只会创建这一次,修改会在这个基础上,之后如果是正常调用,赋值的话没有问题,但是如果使用默认参数,就会再之前修改完的基础上进行。
    x:第一次就是我们通常的赋值,最后的结果也是正常的,第二次使用了x的默认参数,这时候创建了一个默认参数[],这个默认值只会被创建一次(在第一次使用默认参数时),然后append(8),此时的默认值就是[8],当函数再次被调用时,x的默认值是[8]而不是[],因为x只被创建一次。因此一次运算最后是在[8]的基础上进行的,因此最后x=[8,8]。
    y:第一次运算就使用了默认参数,此时y=[6,7],在append(8)之后,y的默认参数变成了[6,7,8],第二次使用了赋值和默认参数无关,第三次是在y=[6,7,8]的基础上进行运算的。
    你可以打印一下id来看一下。

    def func(x=[],y=[6,7]):
        print(id(x))
        print('x0:',x)
        print('y0:',y)
        x.append(8)
        y.append(8)
        print('x1:',x)
        print('y1:',y)
        return(x+y)
    
    a,b=[1,2],[3,4]
    t=func(x=a)
    print(t)
    t=func(y=b)
    print(t)
    t=func()
    print(t)

    输出:

    2246837421056
    x0: [1, 2]
    y0: [6, 7]
    x1: [1, 2, 8]
    y1: [6, 7, 8]
    [1, 2, 8, 6, 7, 8]
    2246837401984
    x0: []
    y0: [3, 4]
    x1: [8]
    y1: [3, 4, 8]
    [8, 3, 4, 8]
    2246837401984
    x0: [8]
    y0: [6, 7, 8]
    x1: [8, 8]
    y1: [6, 7, 8, 8]
    [8, 8, 6, 7, 8, 8]
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?