• python 默认参数潜在的问题


    请先看下面的代码

    import time
    def fun(t = time.time()):
                print(t)
    fun()
    fun()

    以下是输出结果

    1525179319.4658368
    1525179319.4658368

    我们所期望的是当我们多次掉用fun()的时候能够打印出不同的时间,可是实际的情况却是每次所打印的值都是一样的.


    在看下面的例子

    def appendtest(newitem, lista = []):
        lista.append(newitem)
        return lista
    
    print(appendtest('a'))
    print(appendtest('abc'))

    以下是输出结果

    ['a']
    ['a', 'abc']

    结果并不是我们所期望的结果应该是['a']['abc'],就上面两种情况,我们来分析一下原因.


      def 在python中是一个可执行的语句,当解释器执行def的时候,默认参数也会被计算并存在函数的.func_defaults属性中,由于python中函数参数传递的是对象,可变对象在调用者和被调用者之间是共享的,因此当首次调用appendtest()的时候列表lista的值变为[“a”],而在此调用的时候由于默认参数不会重新计算,所以在原先的列表上面又追加了一个['abc']元素,此时列表lista就变成了['a', 'abc'],关于第一个例子的原因和上面所说的是一样的.


    上面两个例子的改正方法:

    import time
    def fun(t=time.time):
        print(t())
    
    def fun_1(a, lists=None):
        if lists is None:
            lists = list()
        print(lists.append(a))

    在这里推荐大家定义默认参数时,使用None或者不可变类型的参数来占位就不会出现上次与期望结果不符的输出了.


    本文到此结束,谢谢大家能耐心的将它读完,如有不足之处还请不吝赐教.

  • 相关阅读:
    CCNA 第二章 以太网回顾
    CCNA 第一章 网络互联
    solidworks中 toolbox调用出现未配置的解决方法
    linux之df命令
    linux之du命令
    linux之pid文件
    linux之mysql启动问题
    linux之使用cron,logrotate管理日志文件
    wordpress(一)wordpress环境的搭建
    phpwind8.7升级9.0.1过程(四)20130207升级到20141228
  • 原文地址:https://www.cnblogs.com/fanlei5458/p/9235479.html
Copyright © 2020-2023  润新知