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,在结束前,重复下廖老师的一句话:定义默认参数要牢记一点:默认参数必须指向不变对象!

  • 相关阅读:
    ORACLE安装(12c-Redhat6.5)
    Exchange Pause or stop transport service
    Exchange Port
    Oracle的启动与关闭
    Exchange OAB(Offline Address Book)
    Exchange NLB 单播和多播模式比较
    Exchange Database Status(Copy Status ,Content Index State,QueueLength,Move Status...)
    发送邮件的三种方式:Send Mail Message
    Exchange Powershell:Get-Counter (List connections to OWA )
    Exchange Management Console Error
  • 原文地址:https://www.cnblogs.com/yns-blogs/p/4651153.html
Copyright © 2011-2022 走看看