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中为feedparser设置超时时间避免堵塞
Sep 28 Python
Python之reload流程实例代码解析
Jan 29 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
Apr 01 Python
Pandas库之DataFrame使用的学习笔记
Jun 21 Python
python3中的eval和exec的区别与联系
Oct 10 Python
python PIL/cv2/base64相互转换实例
Jan 09 Python
python各层级目录下import方法代码实例
Jan 20 Python
解决tensorflow打印tensor有省略号的问题
Feb 04 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
python如何从键盘获取输入实例
Jun 18 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
Dec 10 Python
pytorch 6 batch_train 批训练操作
May 28 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 setcookie指定domain参数后,在IE下设置cookie失效的解决方法
2011/09/09 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
js下写一个事件队列操作函数
2010/07/19 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
js获取地址栏中传递的参数(两种方法)
2017/02/08 Javascript
js实现随机点名小功能
2017/08/17 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
jQuery Ajax async=&gt;false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
ES6基础之 Promise 对象用法实例详解
2019/08/22 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
python读取注册表中值的方法
2013/04/08 Python
Python之列表的插入&amp;替换修改方法
2018/06/28 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
Python模块常用四种安装方式
2020/10/20 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
CSS3实现swap交换动画
2016/01/19 HTML / CSS
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
启动一个线程是用run()还是start()
2016/12/25 面试题
介绍下java.util.Arrays类
2012/10/16 面试题
大学生职业生涯规划书前言
2014/01/09 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
话题作文之呼唤
2019/12/18 职场文书
浅谈Redis中的RDB快照
2021/06/29 Redis