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 相关文章推荐
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 Python
Python编程实战之Oracle数据库操作示例
Jun 21 Python
numpy自动生成数组详解
Dec 15 Python
Django自定义用户认证示例详解
Mar 14 Python
Python实现朴素贝叶斯分类器的方法详解
Jul 04 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
python如何获取当前文件夹下所有文件名详解
Jan 25 Python
python 实现快速生成连续、随机字母列表
Nov 28 Python
Python中remove漏删和索引越界问题的解决
Mar 18 Python
TensorFlow固化模型的实现操作
May 26 Python
python如何建立全零数组
Jul 19 Python
python使用布隆过滤器的实现示例
Aug 20 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 正则表达式的学习探讨
2013/06/06 PHP
php按字符无乱码截取中文的方法
2015/03/27 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
利用Python实现命令行版的火车票查看器
2016/08/05 Python
Python程序中设置HTTP代理
2016/11/06 Python
详解python之协程gevent模块
2018/06/14 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
python已协程方式处理任务实现过程
2019/12/27 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
转让协议书范本
2014/04/15 职场文书
保护野生动物倡议书
2014/05/16 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
门卫岗位职责
2015/02/09 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
go:垃圾回收GC触发条件详解
2021/04/24 Golang
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python