zoukankan      html  css  js  c++  java
  • 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或者不可变类型的参数来占位就不会出现上次与期望结果不符的输出了.


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

  • 相关阅读:
    JVM内存的划分
    劝学
    java中switch的用法
    方法传递参数的分类
    ajax缓存机制
    vuex
    keep-alive
    路由滚动行为scrollBehavior
    vue等
    防止刷新路由后参数消失
  • 原文地址:https://www.cnblogs.com/fanlei5458/p/9235479.html
Copyright © 2011-2022 走看看