• (转)python中函数参数中如果带有默认参数list的特殊情况


    在python中函数参数中如果带有默认参数list遇到问题

    先看一段代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    def f(x,l=[]):
        for in range(x):
            l.append(i*i)
        print(l)
     
    print('---1---')
    f(4)
    print('---2---')
    f(5)

    执行结果:

    1
    2
    3
    4
    ---1---
    [0149]
    ---2---
    [0149014916]

    预期的结果为:

    1
    2
    3
    4
    ---1---
    [0149]
    ---2---
    [014916]

    问题解释:当定义函数时,会保存函数中默认参数list的值,也就是列表[],在每次调用的时候如果传递了列表,则使用传递的列表,没有传递,使用定义函数时保存的默认参数list,以上案例中两次调用都没有传递默认参数list,程序会调用定义函数时,保存的默认参数list,列表在append的时候回在原来的基础上添加,所以会产生以上结果,我们可以通过打印id看出。

    修改代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def f(x,l=[]):
        print(id(l))  # 添加打印id
        for in range(x):
            l.append(i*i)
        print(l)
     
     
    print('---1---')
    f(4)
    print('---2---')
    f(5)

    结果:

    1
    2
    3
    4
    5
    6
    ---1---
    140306123906248
    [0149]
    ---2---
    140306123906248
    [0149014916]

    会发现id值是相同的,说明两次执行时使用的都是定义函数时默认的参数

    再次修改代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def f(x,l=[]):
        print(id(l))
        for in range(x):
            l.append(i*i)
        print(l)
     
     
    print('---1---')
    f(4)
    print('---2---')
    f(5,[])
    print('---3---')
    f(6)

    结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ---1---
    140017293614280
    [0149]
    ---2---
    140017293614472
    [014916]
    ---3---
    140017293614280
    [014901491625]

    会发现执行传递空列表的函数时打印的id不一样,而没有传递的一样。当传递空list时函数体当中会使用传递的空list,没有传递时,使用函数默认的list。所以会产生以上结果

    如果想要达到预期的结果编写一下代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def f(x,l=None):
        if is None:
            = []
        for in range(x):
            l.append(i*i)
        print(l)
     
     
    print('---1---')
    f(4)
    print('---2---')
    f(5)
    print('---3---')
    f(6)

    结果:

    1
    2
    3
    4
    5
    6
    ---1---
    [0149]
    ---2---
    [014916]
    ---3---
    [01491625]

     这样就达到了预期的结果  ------_<_>_------

  • 相关阅读:
    css3简易实现图标动画由小到大逐个显现
    下拉图标呼吸效果制作
    设置图片从页面四周渐入效果的锚点方法
    关于导航宽度高度自适应的小栗子
    Odd-e CSD Course Day 5
    Odd-e CSD Course Day 2
    Odd-e CSD Course Day 3
    Odd-e CSD Course Day 1
    Odd-e CSD Course Day 4
    [心得] SQL Server Partition(表分區) 資料分佈探討
  • 原文地址:https://www.cnblogs.com/lingjiajun/p/9843283.html
Copyright © 2020-2023  润新知