python默认参数陷阱

对于学习python的人都有这样的困惑

def foo(a=[]):
    a.append(5)
    return a

Python新手希望这个函数总是返回一个只包含一个元素的列表:[5]。结果却非常不同,而且非常惊人(对于新手来说):

>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]
>>> foo()
[5, 5, 5, 5]
>>> foo()

实际上,这不是设计缺陷,并不是因为内部或性能。
它只是因为Python中的函数是第一类对象,而不仅仅是一段代码。

一旦你以这种方式思考,那么它就完全有意义了:一个函数是一个被定义的对象; 默认参数是一种“成员数据”,因此它们的状态可能会从一个调用更改为另一个调用 - 与任何其他对象完全相同。

所属网站分类: python基础 > 函数


作者:goodbody

链接:http://www.pythonheidong.com/blog/article/65/

来源:python黑洞网,专注python资源,python教程,python技术!

原文地址:https://www.cnblogs.com/fuchen9527/p/10725605.html

时间: 2024-11-02 18:23:56

python默认参数陷阱的相关文章

易错点 默认参数陷阱

默认参数陷阱 可变的数据类型 (列表)------用于实际开发中不可变数据类型(字符串,数字,元组 ====易错点如下==== def func(l=[]): l.append(123) print(l) func() func([]) func() # [123] # [123] # [123, 123]

python函数默认参数陷阱

对于学习python的人都有这样的困惑 def foo(a=[]): a.append(5) return a Python新手希望这个函数总是返回一个只包含一个元素的列表:[5].结果却非常不同,而且非常惊人(对于新手来说): >>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5] >>> foo() 实际上,这不是设计缺陷

Python 默认参数

定义默认参数 定义函数的时候,还可以有默认参数. 例如Python自带的 int() 函数,其实就有两个参数,我们既可以传一个参数,又可以传两个参数: >>> int('123') 123 >>> int('123', 8) 83 int()函数的第二个参数是转换进制,如果不传,默认是十进制 (base=10),如果传了,就用传入的参数. 可见,函数的默认参数的作用是简化调用,你只需要把必须的参数传进去.但是在需要的时候,又可以传入额外的参数来覆盖默认参数值. 我们来定

Python:默认参数

Python是个人最喜欢的语言,刚开始接触Python时,总觉得有很多槽点,不太喜欢.后来,不知不觉中,就用的多了.习惯了.喜欢上了.Python的功能真的很强大,自己当初学习这门语言的时候,也记录过很多的笔记,现慢慢把这些笔记发布出来,希望对大家有所帮助,对自己也算是一个总结. 关于Python默认参数,假如默认参数是可变对象是会有副作用的,这一点我一开始不是很理解,直到有一天,看到一篇博文说:一个函数参数的默认值,仅仅在该函数定义的时候,被赋值一次.如此,只有当函数第一次被定义的时候,才讲参

Python函数参数默认值的陷阱和原理深究(转)

add by zhj: 在Python文档中清楚的说明了默认参数是怎么工作的,如下 "Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed” value is used

Python中list作为默认参数的陷阱

在Python中,作为默认参数的一定要是不可变对象,如果是可变对象,就会出现问题,稍不注意,就会调入陷阱,尤其是初学者,比如我(┬_┬). 我们来看一个例子. 1 def add(L=[]): 2 L.append(1) 3 return L 4 5 L = [1, 2, 3] 6 newL = add(L) 7 print(newL) 8 newL = add(newL) 9 print(newL) 10 11 testL = add() 12 print(testL) 13 testL =

Python(55)_默认参数的陷阱

#-*-coding:utf-8-*- ''' 函数复习 ''' def f(): return 'bowen' print(2+3) # 事实上python中会调用内部的函数,相当于add() print(f()) def wahaha(*args): print(args) wahaha(1,2,3) l = [1,2,3] wahaha(*l) ''' 默认参数的陷阱 如果默认参数的值是一个可变数据类型,那么每一次调用的时候,不传值就公用这个数据类型的资源 简单的说,就是不传值的情况下,始

python 当list,dic作为默认参数的坑爹之处

先看代码: def foo(a, b =[]): b.append(a) print b foo(1) foo(2) 结果想象中是: >>> [1] [2] >>> 实际上是: >>> [1] [1, 2] >>> 查看官方文档:https://docs.python.org/2.7/tutorial/controlflow.html#default-argument-values The default values are eva

Python函数的默认参数的设计【原创】

在Python教程里,针对默认参数,给了一个“重要警告”的例子: def f(a, L=[]): L.append(a) return L print(f(1)) print(f(2)) print(f(3)) 默认值只会执行一次,也没说原因.会打印出结果: [1] [1, 2] [1, 2, 3] 因为学的第一门语言是Ruby,所以感觉有些奇怪. 但肯定的是方法f一定储存了变量L. 准备知识:指针 p指向不可变对象,比如数字.则相当于p指针指向了不同的内存地址. p指向的是可变对象,比如lis