• 技术文章 >Python技术 >Python基础教程

    python新手常见问题一:乱用表达式

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-06-28 09:16:57原创2381

    在函数参数中乱用表达式作为默认值

    Python允许给一个函数的某个参数设置默认值以使该参数成为一个可选参数。尽管这是这门语言很棒的一个功能,但是这当这个默认值是可变对象(mutable)时,那就有些麻烦了。例如,看下面这个Python函数定义:

    >>> def foo(bar=[]):        
    # bar是可选参数,如果没有指明的话,默认值是[]
    ...    bar.append("baz")    
    # 但是这行可是有问题的,走着瞧…
    ...    return bar

    人们常犯的一个错误是认为每次调用这个函数时不给这个可选参数赋值的话,它总是会被赋予这个默认表达式的值。例如,在上面的代码中,程序员可能会认为重复调用函数foo() (不传参数bar给这个函数),这个函数会总是返回‘baz’,因为我们假定认为每次调用foo()的时候(不传bar),参数bar会被置为[](即,一个空的列表)。

    相关推荐:《Python视频教程

    那么我们来看看这么做的时候究竟会发生什么:

    >>> foo()
    ["baz"]
    >>> foo()
    ["baz", "baz"]
    >>> foo()
    ["baz", "baz", "baz"]

    嗯?为什么每次调用foo()的时候,这个函数总是在一个已经存在的列表后面添加我们的默认值“baz”,而不是每次都创建一个新的列表?

    答案是一个函数参数的默认值,仅仅在该函数定义的时候,被赋值一次。如此,只有当函数foo()第一次被定义的时候,才讲参数bar的默认值初始化到它的默认值(即一个空的列表)。当调用foo()的时候(不给参数bar),会继续使用bar最早初始化时的那个列表。

    由此,可以有如下的解决办法:

    >>> def foo(bar=None):
    ...    if bar is None:      
    # 或者用 if not bar:
    ...        bar = []
    ...    bar.append("baz")
    ...    return bar
    ...
    >>> foo()
    ["baz"]
    >>> foo()
    ["baz"]
    >>> foo()
    ["baz"]
    专题推荐:python 新手 问题
    上一篇:Python中常用的查找数据结构及算法汇总 下一篇:Python新手常见问题二:不正确的使用类变量

    相关文章推荐

    • 基于Python的七种经典排序算法是什么• Python中常用的查找数据结构及算法汇总• Python中的二叉排序树和平衡二叉树是什么

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网