首页 > 编程 > Python > 正文

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

2020-02-23 00:26:55
字体:
来源:转载
供稿:网友
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函数的标准参数和默认参数的一些基本内容。提醒你注意你的代码中可能存在的陷阱。如果你刚开始接触Python,开始写一些函数,我真心推荐你看一下Python官方手册中关于函数的内容,链接如下:Defining Functions 以及 More on Defining Functions。
简单复习一下函数

Python是一个强大的面向对象语言,它把这种编程范式推向了顶峰。但是,面向对象编程仍然需要依靠函数这一概念,你可以用它来处理数据。Python对于可调用对象有一个更宽泛的概念,即任何对象都可以被调用,调用的意思是对其应用数据。

函数在Python中是可调用对象,并且乍一看,它和其他语言中的函数有着类似的行为。它们获取一些数据,这些数据被称为参数,然后处理它们,接着返回结果(如果没有return语句则是None)

参数被声明为占位符(在定义函数的时候),用以代表那些当函数调用时被实际传入的对象。在Python中你不需要声明参数的类型(例如,像你在C或Java中做的那样)因为Python哲学依赖于多态。

记住,Python的变量是引用,即实际变量的内存地址。这意味着Python的函数永远以“传址”的方式工作(这里使用了一个C/C++术语),当你调用一个函数的时候,并不是复制了一份参数的值来替换占位符,而是把占位符指向了变量本身。这导致了一个非常重要的结果:你可以在函数内部改变这个变量的值。这里有一个很好可视化讲解,关于引用机制。

引用在Python扮演着非常重要的角色,它是Python完全多态方式的骨干。关于这个非常重要的主题,请点击这个链接 查看更好的解释。

为了检查你是否理解了这门语言的这一基本特性,请跟随这段简单的代码(变量ph代表的是“占位符(placeholder)”)
 

>>> def print_id(ph):... print(hex(id(ph)))...>>> a = 5>>> print(hex(id(a)))0x84ab460>>> print_id(a)0x84ab460>>>>>> def alter_value(ph):... ph = ph + 1... return ph...>>> b = alter_value(a)>>> b6>>> a5>>> hex(id(a))'0x84ab460'>>> hex(id(b))'0x84ab470'>>>>>> def alter_value(ph):... ph.append(1)... return ph...>>> a = [1,2,3]>>> b = alter_value(a)>>> a[1, 2, 3, 1]>>> b[1, 2, 3, 1]>>> hex(id(a))'0xb701f72c'>>> hex(id(b))'0xb701f72c'>>>            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表