python 默认参数相关知识详解


Posted in Python onSeptember 18, 2019

最常见的一种形式是的是为一个或者多个参数指定默认值,这会创建一个可以使用比定义时允许的参数更少的参数调用的函数,

def ask_ok(prompt, retries=4, reminder='Please try again!'):
  while True:
    ok = input(prompt)
    if ok in ('y', 'ye', 'yes'):
      return True
    if ok in ('n', 'no', 'nop', 'nope'):
      return False
    retries = retries - 1
    if retries < 0:
      raise ValueError('invalid user response')
    print(reminder)

可以用以下三种调用方式:

  • ask_ok('Do you really want to quit?')
  • ask_ok('OK to overwrite the file?', 2)
  • ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')

默认值在函数定义作用域有效,因此:

i = 5
def f(arg=i):
  print(arg)
i = 6
f()

打印为5

重要提醒:默认参数在定义时赋值,且仅仅赋值一次,当函数多次被调用,且并没有提供默认的参数值,就会从定义时赋值的地方取得值。即使函数中给默认参数重新赋值了,下次调用还是会从定义赋值的地方取得值!当默认参数为可变类型的list/dict等类型时,需要注意。

def f(a, L=[]):
  L.append(a)
  return L
print(f(1))
print(f(2,[]))
print(f(3))

输出为:

[1]
[2]
[1,3]

如果不想让默认值咋后续调用中累积,可以用如下写法:

def f(a, L=None):
  if L is None:
    L = []
  L.append(a)
  return L

首先要理解可变对象与不可变对象可以参考http://blog.csdn.net/u014265088/article/details/52756442这篇文章

假如默认参数是可变对象,函数内对参数的改变会影响原始对象,下次调用函数默认参数已经被更改

假如默认参数是不可变对象,函数内对参数赋值时,参数会引用内存其他地方,下次调用函数时还是会从定义时赋值的地方取值。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python二分法实现实例
Nov 21 Python
Python中unittest用法实例
Sep 25 Python
跟老齐学Python之重回函数
Oct 10 Python
使用Python的Tornado框架实现一个Web端图书展示页面
Jul 11 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
基于python神经卷积网络的人脸识别
May 24 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
Django框架视图函数设计示例
Jul 29 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
python如何使用腾讯云发送短信
Sep 17 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 Python
python连接PostgreSQL数据库的过程详解
Sep 18 #Python
Python传递参数的多种方式(小结)
Sep 18 #Python
余弦相似性计算及python代码实现过程解析
Sep 18 #Python
python之yield和Generator深入解析
Sep 18 #Python
PyTorch预训练的实现
Sep 18 #Python
用python实现英文字母和相应序数转换的方法
Sep 18 #Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 #Python
You might like
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
JavaScript的目的分析
2007/01/05 Javascript
Javascript面向对象扩展库代码分享
2012/03/27 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
javascript利用apply和arguments复用方法
2013/11/25 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
Python文件及目录操作实例详解
2015/06/04 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
Python 操作文件的基本方法总结
2017/08/10 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
法制宣传月活动总结
2014/04/29 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
演讲比赛主持词
2015/06/29 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
Python 内置函数速查表一览
2021/06/02 Python
MySql子查询IN的执行和优化的实现
2021/08/02 MySQL
Android中View.post和Handler.post的关系
2022/06/05 Java/Android