zoukankan      html  css  js  c++  java
  • Python:默认参数

    Python是个人最喜欢的语言,刚开始接触Python时,总觉得有很多槽点,不太喜欢。后来,不知不觉中,就用的多了、习惯了、喜欢上了。Python的功能真的很强大,自己当初学习这门语言的时候,也记录过很多的笔记,现慢慢把这些笔记发布出来,希望对大家有所帮助,对自己也算是一个总结。

    关于Python默认参数,假如默认参数是可变对象是会有副作用的,这一点我一开始不是很理解,直到有一天,看到一篇博文说:一个函数参数的默认值,仅仅在该函数定义的时候,被赋值一次如此,只有当函数第一次被定义的时候,才讲参数的默认值初始化到它的默认值(如一个空的列表)。
    听到这个解释,豁然开朗,解释器试验如下:

     1 >>> def f(x = []):
     2     print(id(x))
     3     x.append(1)
     4     print x
     5     print(id(x))
     6 
     7     
     8 >>> f() 
     9 38869952 # 可变默认参数是在原地更改!!!
    10 38869952
    11 >>> f()
    12 38869952 # 再次调用时,可变默认参数还是引用最初定义的!!!
    13 38869952
    14 # 注意,默认参数是在定义时赋值,且仅仅赋值一次。
    15 # 当函数多次被调用,并且没有提供默认的参数值,就会从定义时赋值的地方取得值!
    16 # 即使函数中给默认参数重新赋值了,下次调用还是会从定义赋值的地方取得值!
    17 # 如以下的示例:当f2()多次调用,虽然在函数体里面给y重新赋值了,但是下次调用时
    18 # 再次打印print id(x) 的结果也还是一样的!
    19 # 所以:
    20 # 1. 假如默认参数是可变对象,则会在原处直接更改对象,下次调用参数时,默认参数已经
    21 # 更改过的了。如f()函数。
    22 # 2. 假如默认参数不可变,那么给函数中给 参数赋值时,参数会引用内存的其他地方。下次函数调用时
    23 # 默认参数还是从定义时赋值处取得值,因此没有副作用!
    24 >>> def f2(y = None):
    25     print(id(y))
    26     if not y:
    27         y = []
    28     y.append(1)
    29     print(id(y))
    30 
    31     
    32 >>> f2()
    33 505672708   # 定义时默认参数引用这一块内存。
    34 38888872    # 函数体内赋值后,y引用其他地方。
    35 >>> f2()
    36 505672708    # 再次调用,y还是引用定义时赋值的内存处。
    37 43910728     # 函数体内赋值后,y引用其他地方。
    38 >>> f()
    39 38869952 
    40 38869952
    41 >>> f2()
    42 505672708
    43 43909408
    44 >>> f2()
    45 505672708
    46 38868752
    47 >>>
  • 相关阅读:
    Coursera机器学习week11 单元测试
    关于 TypeReference 的解释
    getModifiers 方法解释。
    instanceof isInstance isAssignableFrom 比较
    elasticsearch 基础 语法总结
    kibana 启动 关闭 和进程查找
    MD5 SHA1 SHA256 SHA512 SHA1WithRSA 的区别
    spring boot 项目 热启动
    java zip 压缩文件
    Packet for query is too large (1660 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
  • 原文地址:https://www.cnblogs.com/bitpeng/p/4747765.html
Copyright © 2011-2022 走看看