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

时间: 2024-07-31 12:46:55

Python的函数参数问题的相关文章

python中函数参数的引用方式

值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是"传对象引用"的方式.这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过"传引用"来传递对象.如果函数收到的是一个不可变对象(比如数字.字符或者元组)的引用,就不能直接修改原始对象--相当于通过"传值

Python的函数参数

前言 python中 函数的参数可以分为两大类形参和实参~ def func(x, y): # x, y 就是形参 print(x, y) func(2, 3) # 2, 3 就是实参 - 形参 形参(如上面的x, y)仅在定义的函数中有效,函数调用结束后,不能再使用该形参变量.在调用函数时,该函数中的形参才会被分配内存,并赋值:函数调用结束,分配的内存空间也随即释放~ - 实参 即在调用函数时,向该函数的形参传递确定的值(必须是确定的值).传递的值可以是常量.变量.表达式.函数等形式~ 在形参

python的函数参数基础(一)(可能和别人讲的不一样,稍微深入一点)

先让我说几句废话,函数(java里面叫方法)可能是我们了解python以后最基础的东西了(除了数据结构),写了无数个函数,你真的了解python的函数的设计逻辑以及思想吗? 先上一小段我们最经常写的代码,我简单剖析一下: 1 def func_test(x,y,z): 2 print(x,y,z) 3 return None 4 5 if __name__ == '__main__': 6 func_test(1,y=2,z=3) 上面这个代码很简单,就是定义了一个函数,让这个函数打印传入的三个

python下函数参数的传递(*和**)

1.F(arg1,arg2,...) 这 是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的 值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参.例 如: def a(x,y): print x,y 调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错. 2.F(arg

Python之函数参数介绍

Python的参数类型: 普通参数 默认参数 动态参数 普通参数 包括:形参和实参 形参就是形式参数,仅仅是写在函数中,并没有赋值和调用它 实参则是执行函数时用到的参数,它在内存中有赋值 例子: test(txt):     txt,test() 输出结果:hello this is a test 这里txt就是形参,'hello'则是实参 默认参数: 默认参数的要求: 1.不传,则使用默认值, 2.默认参数必须放在参数列表最后 calculation(x,y,z=):     x+y+z ca

Python的函数参数和递归参数

位置参数 def power(x): return x*x; 默认参数 指的是在函数定义的时候,就赋予一些参数默认值,在调用这个函数的时候不必多次传入重复的参数值. 如定义一个多次输出同一个年龄阶段和同一个城市的学生的姓名和性别. def info(name,gender,age=20,city='sichuan'): print('name:', name) print('gender:', gender) print('age',age) print('city',city) info("x

python中函数参数*args和**kw的区别

1.函数与参数(实参) 在python中创建函数是def,创建函数名是def f(),f函数名字,def f(a,b),这里的a,b是两个参数,函数名是自定义的,参数也是自定义,随意就好.看图如下效果: 这里f(1,2)是实参,然后调用上面的函数. 下面讲解下*args和**kw的区别. 2.*args 这里的*后面的值是自定义的,只要不是数字就行,定义成*abc,*ccc都可以,len()是函数,它的意思是返回字符串长度.然后前面的a,b是普通参数,print a print b就是回显1,2

python之函数参数问题(参数为可变对象)

今天看到一段代码,其中函数入参有一个参数为list,类似如下: def linux_monitor(pid=0,pidlist = []): pidlist.append(pid) 通过测试发现是有问题的,在其中加入print和调用即可发现(使用默认参数值调用俩次): def linux_monitor(pid=0,pidlist = []): pidlist.append(pid) print(pid) print(pidlist) linux_monitor()linux_monitor()

【Python】函数参数类型及用法

 一.函数的参数类型 def hs(a1,a2,a3,...): ****statements 其中a1,a2,a3是函数的参数,函数的参数类型可分为:必须参数.默认参数.可变参数(不定长参数).关键字参数.组合参数,总共5种. 二.必须参数 其实我们之前举得例子就是必须参数,以下例子必须参数: >>>def hello(str): .... print('必须参数是:',str) >>>hello('hello,world') 我们可以看到在函数hello中,str作