Python中的默认参数实例分析

本文研究的主要是Python中的默认参数的相关内容,具体如下。

熟悉C++语言的可以知道,C++语言中的默认参数是写在函数声明中的,为语法糖,与函数的调用无关,是在函数调用的时候由编译器补齐参数然后进行调用。

而Python中的默认参数与其有相当大的不一样,如下例中的代码执行结果会是什么呢?

def test_parameter(a, dfp=[]):
 dfp.append(a)
 print(dfp)

test_parameter(1)
test_parameter(2)
test_parameter(3)

从结果中可以看到其结果如下,与我们期望完全不一致:

[1]
[1, 2]
[1, 2, 3]

分析

为什么Python的默认参数是这样的表现,需要从Python的函数定义说起。Python中 def 实际上是可执行语句,执行 def 的时候会创建一个函数对象,而默认参数也会在执行 def 语句的时候计算出来并存在函数的_defaults_属性中。

def test_parameter(a, dfp=[]):
 dfp.append(a)
 print(id(dfp))

test_parameter(1)
test_parameter(2)
print(test_parameter.__defaults__)
print(id(test_parameter.__defaults__[0]))

结果如下,可见调用函数时使用的默认参数和_defaults_中的对象为同一对象:

140109485401224
140109485401224
([1, 2],)
140109485401224

使用

在明白上述原理后,可以知道以后在使用默认参数的时候需要注意,如果默认参数是可变对象则需要判断是否每次调用函数时是共享默认参数还是产生新对象。如果是新生成对象,常采用None作为默认参数占位,如果判断当前为None,则新建可变对象使用。

def test(a, dfp=None):
 if dfp is None:
  dfp = []
 pass #使用dfp

总结

以上就是本文关于Python中的默认参数实例分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

您可能感兴趣的文章:

  • Python中函数及默认参数的定义与调用操作实例分析
  • Python进阶-函数默认参数(详解)
  • 深入讲解Python函数中参数的使用及默认参数的陷阱
  • python 默认参数问题的陷阱
  • Python中的默认参数详解
  • Python中使用partial改变方法默认参数实例
  • 详细介绍Python函数中的默认参数
  • Python实现partial改变方法默认参数
时间: 2018-01-26

python 默认参数问题的陷阱

python 里面一个常见的陷阱就是函数的默认参数问题.如下: def func(mylist = []): mylist.append(1) return mylist 以下的执行结果如下: print func() print func() print func() print func(['a']) print func() 结果如下: [1] [1, 1] [1, 1, 1] ['a', 1] [1, 1, 1, 1] 如此结果, 前面三个可以看出 如果没有指定参数的话, 每次调用函数时

详细介绍Python函数中的默认参数

import datetime as dt def log_time(message, time=None): if time is None: time=dt.datetime.now() print("{0}: {1}".format(time.isoformat(), message)) 最近我在一段Python代码中发现了一个因为错误的使用默认参数而产生的非常恶心的bug.如果您已经知道关于默认参数的全部内容了,只是想嘲笑一下我这可笑的错误,请直接跳到本文末尾.哎,这段代码是我

Python中的默认参数详解

文章的主题 不要使用可变对象作为函数的默认参数例如 list,dict,因为def是一个可执行语句,只有def执行的时候才会计算默认默认参数的值,所以使用默认参数会造成函数执行的时候一直在使用同一个对象,引起bug. 基本原理 在 Python 源码中,我们使用def来定义函数或者方法.在其他语言中,类似的东西往往只是一一个语法声明关键字,但def却是一个可执行的指令.Python代码执行的时候先会使用 compile 将其编译成 PyCodeObject. PyCodeObject 本质上依然

深入讲解Python函数中参数的使用及默认参数的陷阱

C++里函数可以设置缺省参数,Java不可以,只能通过重载的方式来实现,python里也可以设置默认参数,最大的好处就是降低函数难度,函数的定义只有一个,并且python是动态语言,在同一名称空间里不能有想多名称的函数,如果出现了,那么后出现的会覆盖前面的函数. def power(x, n=2): s = 1 while n > 0: n = n - 1 s = s * x return s 看看结果: >>> power(5) 25 >>> power(5,3

Python实现partial改变方法默认参数

在Python的标准库中,functools库中有很多对方法有操作的封装功能,partial Objects就是其中之一,他可以实现对方法参数默认值的修改.本文就以实例代码说明这一功能. 下面就看下简单的应用测试实例.具体代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- #python2.7x #partial.py #authror: orangleliu ''' functools 中Partial可以用来改变一个方法默认参数 1 改变原

Python中函数及默认参数的定义与调用操作实例分析

本文实例讲述了Python中函数及默认参数的定义与调用操作.分享给大家供大家参考,具体如下: #coding=utf8 ''''' Python中的函数使用小括号调用.函数在调用之前必须先定义. 如果函数中没有return语句,就会自动返回None对象. Python是通过引用调用的.如果函数内对参数的改变会影响到原始对象. 只有可变对象会受此影响,对不可变对象,它的行为类似按值调用. ''' ''''' 定义函数: def function_name([arguments]): "option

Python进阶-函数默认参数(详解)

一.默认参数 python为了简化函数的调用,提供了默认参数机制: def pow(x, n = 2): r = 1 while n > 0: r *= x n -= 1 return r 这样在调用pow函数时,就可以省略最后一个参数不写: print(pow(5)) # output: 25 在定义有默认参数的函数时,需要注意以下: 必选参数必须在前面,默认参数在后: 设置何种参数为默认参数?一般来说,将参数值变化小的设置为默认参数. python标准库实践 python内建函数: prin

Python中使用partial改变方法默认参数实例

Python 标准库中 functools库中有很多对方法很有有操作的封装,partial Objects就是其中之一,他是对方法参数默认值的修改. 下面就看下简单的应用测试. 复制代码 代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- #python2.7x #partial.py #authror: orangleliu ''' functools 中Partial可以用来改变一个方法默认参数 1 改变原有默认值参数的默认值 2 给原来没

python中列表元素连接方法join用法实例

本文实例讲述了python中列表元素连接方法join用法.分享给大家供大家参考.具体分析如下: 创建列表: >>> music = ["Abba","Rolling Stones","Black Sabbath","Metallica"] >>> print music 输出: ['Abba', 'Rolling Stones', 'Black Sabbath', 'Metallica']

Python中生成Epoch的方法

在Python2中datetime对象没有timestamp方法,不能很方便的生成epoch,现有方法没有处理很容易导致错误.关于Epoch可以参见时区与Epoch 0 Python中生成Epoch from datetime import datetime # python3 datetime.now().timestamp() # python2 import time time.mktime(datetime.now().timetuple()) # 为了兼容python2和3,该用法使用

Python中的对象,方法,类,实例,函数用法分析

本文实例分析了Python中的对象,方法,类,实例,函数用法.分享给大家供大家参考.具体分析如下: Python是一个完全面向对象的语言.不仅实例是对象,类,函数,方法也都是对象. 复制代码 代码如下: class Foo(object):     static_attr = True     def method(self):         pass foo = Foo() 这段代码实际上创造了两个对象,Foo和foo.而Foo同时又是一个类,foo是这个类的实例. 在C++里类型定义是在编

python中偏函数partial用法实例分析

本文实例讲述了python中偏函数partial用法.分享给大家供大家参考.具体如下: 函数在执行时,要带上所有必要的参数进行调用.但是,有时参数可以在函数被调用之前提前获知.这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用. 例如: In [9]: from functools import partial In [10]: def add(a,b): ....: return a+b ....: In [11]: add(4,3) Out[11]: 7 In

Python中set与frozenset方法和区别详解

set(可变集合)与frozenset(不可变集合)的区别: set无序排序且不重复,是可变的,有add(),remove()等方法.既然是可变的,所以它不存在哈希值.基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交集), difference(差集)和sysmmetric difference(对称差集)等数学运算. sets 支持 x in set, len(set),和 for x in set.作为一个无序的集合,sets不记录元素位

java反射_改变private中的变量及方法的简单实例

java反射_改变private中的变量及方法的简单实例 class DemoTest{ private String name="123"; public getName(){ system.out.println("public getName " + name); return name; } private getName2(){ system.out.println("private getName2 " + name); return

python中List的sort方法指南

简单记一下python中List的sort方法(或者sorted内建函数)的用法. List的元素可以是各种东西,字符串,字典,自己定义的类等. sorted函数用法如下: sorted(data, cmp=None, key=None, reverse=False) 其中,data是待排序数据,可以使List或者iterator, cmp和key都是函数,这两个函数作用与data的元素上产生一个结果,sorted方法根据这个结果来排序. cmp(e1, e2) 是带两个参数的比较函数, 返回值