美文网首页
python形参列表默认值

python形参列表默认值

作者: 茶客furu声 | 来源:发表于2017-05-28 17:58 被阅读272次

    今天在码python的时候遇到灵异事件,查阅python官方文档后发现原来python的形参列表默认值有个很值得注意的地方

    默认参数在函数初始化的时候默认值就被赋值,因此如果参数默认值为变量,则变量值在初始化函数时就被确认下来。

    默认形参是普通变量

    下面这个例子很好理解:

    i = 5
    
    def f(arg=i):
        print arg
    
    i = 6
    f()
    

    由于参数在初始化的时候默认值被赋值为5,后面再修改i,不会再影响这个形参的默认值了。
    所以将打印输出5,而不是6。

    默认形参是对象实例

    我们知道,赋值对象实例其实传递的是实例的内存地址,那这种情况下,改变这个对象实例将影响函数的执行结果。
    把上面的默认形参改为一个list(python的list也是一种对象)。

      i = [5]
      
      def f(arg=i):
          print arg
      
      i[0] = i[0] + 1
      f()
    

    这个执行结果是[6]。
    甚至,在函数内部对这个默认形参的操作,也会被带到下一次执行中。

    def f(a, L=[]):
        L.append(a)
        return L
    
    print f(1)
    print f(2)
    print f(3)
    

    执行结果:

    [1]
    [1, 2]
    [1, 2, 3]
    

    因此,官方建议一种更好的写法,来规避这个问题。

    def f(a, L=None):
        if L is None:
            L = []
        L.append(a)
        return L
    

    其实这个做法是说,当需要给一个形参做默认值,而且这个默认值是一个对象实例的时候,应该把赋值的工作放在函数内部,而不要写到函数定义的参数列表中。

    相关文章

      网友评论

          本文标题:python形参列表默认值

          本文链接:https://www.haomeiwen.com/subject/asehfxtx.html