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


    一、问题

    定义有默认参数的函数。



    二、解决方案

    直接在函数定义中给参数指定默认值。

    def test(a, b=2):
    	print(a, b)
    test(1)
    test(1, 3)
    

    输出:

    1 2
    1 3
    


    默认参数是可修改的容器,如:列表、字典、集合,可以用 None 作为默认值。

    def test(a, b=None):
        if b is None:
            return None
        else:
            return []
    
    print(test(1, None))
    print(test(1, []))
    

    输出:

    None
    []
    


    最好不要用if not b:代替if b is None:

    因为在if not b:中,当b是长度为0的字符串、列表、元组、字典时,也会返回 None。所以会将输入为[], (), {} 当成没有输入。

    def test(a, b=None):
        if not b:
            return None
        else:
            return []
    print(test(1, None))
    print(test(1, []))
    

    输出:

    None
    None
    


    并不想提供一个默认值,仅测试默认参数是不是传进来。

    测试参数是否被传递进来,不能 None、0、False值,因为这些值都是合法的,需要创建一个独一无二的私有对象实例。如:object 类的实例 object()

    _no_value = object()
    def test(a, b=_no_value):
        if b is _no_value:
            print('b值没有传进来。')
        else:
            print(b)
    
    test(1)
    test(1, None)
    

    输出:

    b值没有传进来。
    None
    

    传递一个 None 值和不传值两种情况不同。



    三、讨论

    默认参数的值仅在函数定义的时候赋值一次。

    x = 2
    def test(a, b=x):
        print(a, b)
    test(1)
    
    x = 3
    test(1)
    

    输出:

    1 2
    1 2
    

    改变 x 的值对默认参数值没影响,因为在函数定义的时候已经确定了它的默认值。



    默认参数的值是不可改变的对象。

    def test(a, b=[]):
        return b
    
    t = test(1)
    print(t)
    
    t.append(2)
    t.append('wangke')
    print(t)
    

    输出:

    []
    
    [2, 'wangke']
    

    上面示例,b 的默认值是可改变对象,对 b 进行修改,下次调用这个函数默认值会改变。

    为避免这种情况,将默认值设为 None。



  • 相关阅读:
    mvc UrlHelper
    Bootstrap框架
    Swiper插件
    JQuery 滚动条长度
    JQuery 全屏滚动
    JQuery TODOList
    JQuery 节点操作
    JQuery 事件委托 事件代理
    JQuery 关闭事件冒泡
    JQuery resize和scroll方法
  • 原文地址:https://www.cnblogs.com/keye/p/15661261.html
Copyright © 2011-2022 走看看