zoukankan      html  css  js  c++  java
  • python函数中把列表(list)当参数时的"入坑"与"出坑"

    在Python函数中,传递的参数如果默认有一个为 列表(list),那么就要注意了,此处有坑.

    入坑

    挖坑

    def f(x,li=[]):
        for i in range(x):
            li.append(i*i)
        print(li)
     
    print('---1---')
    f(4)
    print('---2---')
    f(5)
    

    预期结果

    ---1---
    [0, 1, 4, 9]
    ---2---
    [0, 1, 4, 9, 16]
    

    执行结果

    ---1---
    [0, 1, 4, 9]
    ---2---
    [0, 1, 4, 9, 0, 1, 4, 9, 16]
    

    出坑

    当定义函数时,会保存函数中默认参数 list 的值,也就是列表 li=[];

    在每次调用的时候如果传递了新的列表,则使用传递的列表,没有传递,使用定义函数时保存的默认参数(li=[]);

    上面两次调用中,都没有传递新的列表(使用默认列表 li=[] ),程序会调用定义函数时保存的默认参数((li=[]));

    列表在append的时候会在 li=[] 原来的基础上append追加值,所以会产生以上结果.

    通过打印列表的ID进行辨识

    打印列表 li=[] 的ID:

    def f(x,li=[]):
        print(id(li))  # 添加打印id
        for i in range(x):
            li.append(i*i)
        print(li)
     
     
    print('---1---')
    f(4)
    print('---2---')
    f(5)
    

    结果:

    ---1---
    140306123906248
    [0, 1, 4, 9]
    ---2---
    140306123906248
    [0, 1, 4, 9, 0, 1, 4, 9, 16]
    

    会发现ID值是相同的;

    说明两次执行时使用的都是定义函数时的默认参数 li=[ ]

    执行时往里面传新的列表

    打印列表 li=[] 的ID 和 传的新列表的ID:

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

    结果:

    ---1---
    [0, 1, 4, 9]
    ---2---
    [0, 1, 4, 9, 16]
    ---3---
    [0, 1, 4, 9, 0, 1, 4, 9, 16, 25]
    

    会发现执行传递空(新)列表的函数时打印的ID不一样,而没有传递的一样;

    当传递空列表时,函数体当中会使用传递的空列表,没有传递时,使用函数默认值 li=[ ], 所以会产生以上结果.

    优化

    如果想要达到预期的结果,只需要在函数体里进行判断即可:

    def f(x, li=[]):
        if not li:
            # 如果li不为空的话,就往下走(清空列表); 为空就不走
            li = []
        for i in range(x):
            li.append(i * i)
        print(li)
    
    
    print('---1---')
    f(4)
    print('---2---')
    f(5)
    print('---3---')
    f(6)
    

    结果:

    ---1---
    [0, 1, 4, 9]
    ---2---
    [0, 1, 4, 9, 16]
    ---3---
    [0, 1, 4, 9, 16, 25]
    

    转自:https://www.cnblogs.com/bigtreei/p/8992431.html

  • 相关阅读:
    HDU 1358 Period (KMP)
    POJ 1042 Gone Fishing
    Csharp,Javascript 获取显示器的大小的几种方式
    css text 自动换行的实现方法 Internet Explorer,Firefox,Opera,Safar
    Dynamic Fonts动态设置字体大小存入Cookie
    CSS Image Rollovers翻转效果Image Sprites图片精灵
    CSS three column layout
    css 自定义字体 Internet Explorer,Firefox,Opera,Safari
    颜色选择器 Color Picker,Internet Explorer,Firefox,Opera,Safar
    CSS TextShadow in Safari, Opera, Firefox and more
  • 原文地址:https://www.cnblogs.com/xxpythonxx/p/11919747.html
Copyright © 2011-2022 走看看