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

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 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图