zoukankan      html  css  js  c++  java
  • 函数的列表作为默认参数

    函数的列表作为默认参数带来的问题

    #_*_ encoding: utf-8 _*_   @author: ty  hery   2019/9/5
    
    def extendList(val, list=[]):
        print('这个是开始之前列表: ',list)
        list.append(val)
        print(f'这个是append({val})之后的列表当前的列表: ',list)
        return list
    list1 = extendList('b')
    print ("第一次: list1 = %s, id(list1)=%s" % (list1,id(list1)))
    
    list2 = extendList(123)
    print ("第一次: list2 = %s, id(list2)=%s" % (list2,id(list2)))
    
    list3 = extendList('a')
    print ("第一次: list3 = %s, id(list3)=%s" % (list3,id(list3)))
    
    list4= extendList(124,[])
    print ("第一次: list4 = %s, id(list4)=%s" % (list4,id(list4)))
    
    list5= extendList(124,[5,6])
    print ("第一次: list5 = %s, id(list5)=%s" % (list5,id(list5)))
    
    print ("list1 = %s, id(list1)=%s" % (list1,id(list1)))
    print ("list2 = %s, id(list2)=%s" % (list2,id(list2)))
    print ("list3 = %s, id(list3)=%s" % (list3,id(list3)))
    print ("list4 = %s, id(list4)=%s" % (list4,id(list4)))
    print ("list5 = %s, id(list5)=%s" % (list5,id(list5)))
    输出: 这个是开始之前列表:  []
    这个是append(b)之后的列表当前的列表:  ['b']
    第一次: list1 = ['b'], id(list1)=167821448
    这个是开始之前列表:  ['b']
    这个是append(123)之后的列表当前的列表:  ['b', 123]
    第一次: list2 = ['b', 123], id(list2)=167821448
    这个是开始之前列表:  ['b', 123]
    这个是append(a)之后的列表当前的列表:  ['b', 123, 'a']
    第一次: list3 = ['b', 123, 'a'], id(list3)=167821448
    这个是开始之前列表:  []
    这个是append(124)之后的列表当前的列表:  [124]
    第一次: list4 = [124], id(list4)=167823688
    这个是开始之前列表:  [5, 6]
    这个是append(124)之后的列表当前的列表:  [5, 6, 124]
    第一次: list5 = [5, 6, 124], id(list5)=167845256
    list1 = ['b', 123, 'a'], id(list1)=167821448
    list2 = ['b', 123, 'a'], id(list2)=167821448
    list3 = ['b', 123, 'a'], id(list3)=167821448
    list4 = [124], id(list4)=167823688
    list5 = [5, 6, 124], id(list5)=167845256
    

    '''许多人会错误的认为 list1 应该等于 [10] 以及 list3 应该等于 ['a']。认为 list 的参数会在 extendList 每次被调
    用的时候会被设置成它的默认值 []。
    尽管如此,实际发生的事情是,新的默认列表仅仅只在函数被定义时创建一次。随后当 extendList 没有被指定
    的列表参数调用的时候,其使用的是同一个列表。这就是为什么当函数被定义的时候,表达式是用默认参数被
    计算,而不是它被调用的时候。
    https://www.cnblogs.com/xuchunlin/p/6049371.html 5/61
    因此,list1 和 list3 是操作的相同的列表。而 ````list2是操作的它创建的独立的列表(通过传递它自己的空列表
    作为list``` 参数的值)。
    extendList 函数的定义可以做如下修改,但,当没有新的 list 参数被指定的时候,会总是开始一个新列表,这
    更加可能是一直期望的行为。'''

    修改策略

    def extendList(val, list=None):
        if list is None:
            list = []
            list.append(val)
        return list
    
    list1 = extendList(10)
    list2 = extendList(123,[])
    list3 = extendList('a')
    print ("list1 = %s" % list1)
    print ("list2 = %s" % list2)
    print ("list3 = %s" % list3)
    输出:
    list1 = [10]
    list2 = []
    list3 = ['a']
    
    写入自己的博客中才能记得长久
  • 相关阅读:
    [笔记]流行数据库SQL差异分析之“不从实体表中取得数据”
    如何评价架构的优劣(转)
    Entity Framework 学习总结之一:ADO.NET 实体框架概述
    [笔记]流行数据库SQL差异分析之“自动增长字段”
    Entity Framework 学习总结之十:加载相关对象
    Entity Framework 学习总结之九:LinqToEntities
    Entity Framework 学习总结之二:数据访问区别
    3、网站前端优化11条笔记汇总
    Entity Framework 学习总结之八:EntitySQL 复杂查询及函数
    Entity Framework 学习总结之七:EntitySQL 基本查询
  • 原文地址:https://www.cnblogs.com/heris/p/14642487.html
Copyright © 2011-2022 走看看