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中针对函数处理的特殊方法
Mar 06 Python
Python切片用法实例教程
Sep 08 Python
Python中的zipfile模块使用详解
Jun 25 Python
Python实现递归遍历文件夹并删除文件
Apr 18 Python
对python中的xlsxwriter库简单分析
May 04 Python
python爬取网页转换为PDF文件
Jun 07 Python
浅谈python脚本设置运行参数的方法
Dec 03 Python
Django 1.10以上版本 url 配置注意事项详解
Aug 05 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
python 命名规范知识点汇总
Feb 14 Python
Python导入模块包原理及相关注意事项
Mar 25 Python
Django配置Bootstrap, js实现过程详解
Oct 13 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 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
JavaScript语言中的Literal Syntax特性分析
2007/03/08 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
2020/11/18 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
学习Python selenium自动化网页抓取器
2018/01/20 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
python遍历小写英文字母的方法
2019/01/02 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
pandas之分组groupby()的使用整理与总结
2020/06/18 Python
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
班会关于环保演讲稿
2013/12/29 职场文书
电子信息专业自荐书
2014/02/04 职场文书
先进集体事迹材料
2014/02/17 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
先进事迹材料范文
2014/12/29 职场文书
学校社团活动总结
2015/05/07 职场文书
2016年教师节感言
2015/12/09 职场文书
小学美术教学反思
2016/02/17 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android