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条)

报告相同问题?

悬赏问题

  • ¥15 无源定位系统的时差估计误差标准差
  • ¥15 请问这个代码哪里有问题啊
  • ¥20 python--version在命令端输入结果Python is not defined怎么办?还有pip不是exe格式是不是没安装成功?
  • ¥15 通过GaussianView进行结构微调消除虚频
  • ¥15 调用transformers库
  • ¥15 由于导出的数据名字中带有/,导致Matlab打不开,怎么办?
  • ¥15 新硬盘安装的程序总是崩溃,提示遇到错误
  • ¥15 openpcdet自制数据集评估bev精度和3d精度相同
  • ¥15 excel 上下按钮 显示行
  • ¥20 云卓h12pro 数传问题