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中lambda的用法及其与def的区别解析
Jul 28 Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
python开发利器之ulipad的使用实践
Mar 16 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
python笔记:mysql、redis操作方法
Jun 28 Python
分享一下Python数据分析常用的8款工具
Apr 29 Python
pyspark 读取csv文件创建DataFrame的两种方法
Jun 07 Python
Python错误处理操作示例
Jul 18 Python
对Python 语音识别框架详解
Dec 24 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
Jul 04 Python
Django中使用MySQL5.5的教程
Dec 18 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 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
解决vue点击控制单个样式的问题
2018/09/05 Javascript
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
[25:45]2018DOTA2亚洲邀请赛4.5SOLO赛 Sylar vs Paparazi
2018/04/06 DOTA
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
2013/11/15 Python
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
Python中私有属性的定义方式
2020/03/05 Python
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
中国央视网签名寄语
2014/01/18 职场文书
精神文明建设标语
2014/06/16 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
助学贷款贫困证明
2014/09/23 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
公司员工管理制度
2015/08/04 职场文书
PHP策略模式写法
2021/04/01 PHP
SQL使用复合索引实现数据库查询的优化
2022/05/25 SQL Server