zoukankan      html  css  js  c++  java
  • Python中list作为默认参数的陷阱

      在Python中,作为默认参数的一定要是不可变对象,如果是可变对象,就会出现问题,稍不注意,就会调入陷阱,尤其是初学者,比如我(┬_┬)。

      我们来看一个例子。

     1 def add(L=[]):
     2     L.append(1)
     3     return L
     4 
     5 L = [1, 2, 3]
     6 newL = add(L)
     7 print(newL)
     8 newL = add(newL)
     9 print(newL)
    10 
    11 testL = add()
    12 print(testL)
    13 testL = add()
    14 print(testL)
    15 testL = add()
    16 print(testL)

      运行结果如图:

      

      在正常传入参数的时候,好像没什么大问题。但是当我们使用默认参数的时候,问题出现了。

      运行结果没有按我们的预期出现。原因何在?

      当我们调用函数时,如果有传递参数,则使用传递的参数,如果没有传递参数,就使用默认参数。而使用默认参数的时候,使用的是同一个,也就是保存的上一个默认参数值。我们可以通过打印id来验证一下。

      

      因此,默认参数一定要是不可变对象,如果是可变对象的话,就会出现上述情况。

      那么如何解决呢?

      我们可以让L先指向None这个不可变变量,然后增加一个判断,让默认参数重新归位即可。

     1 def add(L=None):
     2     if(L == None):
     3         L = []
     4     L.append(1)
     5     return L
     6 
     7 L = [1, 2, 3]
     8 newL = add(L)
     9 print(newL)
    10 newL = add(newL)
    11 print(newL)
    12 
    13 testL = add()
    14 print(testL)
    15 testL = add()
    16 print(testL)
    17 testL = add()
    18 print(testL)

      

      这样子,我们就解决了这个陷阱,那么下次就不应该再掉进去了,你说是不是?

      牢记:默认参数要使用不可变对象!!!

      不可变(immutable):int、string、float、number、tuple

      可变(mutable):dictionary、list、set

  • 相关阅读:
    建造者(Builder)模式
    模板方法模式(Tempalte Method Pattern)
    NIO Socket编程实例
    Java NIO概述
    转:Java中的Clone()方法详解
    调停者(Mediator)模式
    门面(Facade)模式
    struts2中方法拦截器(Interceptor)的中的excludeMethods与includeMethods的理解
    Struts2默认拦截器配置
    struts2的json-default和struts-default的区别
  • 原文地址:https://www.cnblogs.com/Bil369/p/9400548.html
Copyright © 2011-2022 走看看