zoukankan      html  css  js  c++  java
  • Python的函数参数问题

    先定义一个带默认参数的函数:

    def add_end(L=[]):
        L.append('END')
        return L

    使用下面的代码调用该函数:

    print(add_end([1,2,3]))
    print(add_end())
    print(add_end([1,2,3]))
    print(add_end())

    结果:

    为什么第四行输出会是这样呢?看了廖雪峰老师的教程后,对此问题的理解为:

      在定义完函数后,参数L的值就被计算出来了,并成为了一个类似于“全局变量”的东西,也就是说,一次调用函数完了之后,这个变量不会被回收,当继续以无参的形式调用该函数时,L指向的将继续是原本的那个list空间。以上面的例子说明。第一行,把L指向一个list[1,2,3],运行没问题。第二行,没有传入参数,使用默认参数,L指向一开始就准备好了的空的list[],运行没问题。第三行,和第一行一样。第四行,没有传入参数,L指向一开始就准备好了的list,这时候的list因为第二行的改变已经从[]变成了['END'],所以运行的结果是['END','END']。

      那么,该怎么修改呢?下面给出廖老师的修改方法:

    def add_end(L=None):
        if L is None:
            L = []
        L.append('END')
        return L

    上面的代码中,当使用默认参数(没有传参进来的时候)时,L被赋予一个list,注意,这个list是临时的,即他的生命周期就是一次函数的调用周期,当函数被调用结束时,他会被回收,不会对下次的调用产生影响,这也是和上面的有问题的代码中的全局的list的差别所在。

    ok,在结束前,重复下廖老师的一句话:定义默认参数要牢记一点:默认参数必须指向不变对象!

  • 相关阅读:
    Linux systemtap定位系统IO资源使用情况(ok)
    DISK 100% BUSY,谁造成的?(ok)
    容易被误读的IOSTAT
    利用BLKTRACE分析IO性能
    iowait 过高问题的查找及解决linux
    top后台执行显示:top: failed tty get 错误
    Nginx解读内置非默认模块 ngx_http_stub_status_module
    Nginx健康检查模块
    平滑升级你的Nginx
    Practice telephone techniques
  • 原文地址:https://www.cnblogs.com/yns-blogs/p/4651153.html
Copyright © 2011-2022 走看看