本文字数:1575 字

阅读本文大概需要:4 分钟

写在之前

Python 提供了很多让使用者觉得舒服至极的功能特性,但是随着不断的深入学习和使用 Python,我发现其中存在着许多玄学的输出与之前预想的结果大相径庭,这个对于初学者来说难以理解,但是在理解它们以后又会觉得是这么的有意思,所以我准备了这个「有趣的 Python 特性」系列,写一些我碰到或看到的一些你所不知道的「奇葩」,这里面会涉及到在 Python2 和 Python3 中的异同,希望大家能从学习的过程中体会到真正的乐趣。

当心默认可变参数

首先我们先来看一个例子:

def test_func(default_arg=[]):    default_arg.append('rocky0429')    return default_arg

我们都知道如果调用上述函数 1 次以后所出现的结果:

>>> test_func()['rocky0429']

那么如果调用 2 次,3 次呢?你可以先自己思考一下再继续看下面的结果:

>>> test_func()['rocky0429', 'rocky0429']>>> test_func()['rocky0429', 'rocky0429', 'rocky0429']

咦?明明我们的函数里明明对默认的可变参数赋值了,为什么第 1 次调用是初始化的状态,第 2 次,第 3 次出现的结果就不是我们想要的了呢?先别急,我们再继续看下面的调用:

>>> test_func([])['rocky0429']>>> test_func()['rocky0429', 'rocky0429', 'rocky0429', 'rocky0429']

是不是更懵了?

其实出现这样的结果是因为 Python 中函数的默认可变参数并不是每次调用该函数时都会初始化。相反,它们会使用最近分配的值作为默认值。在上述的 test_func([]) 的结果不同是因为,当我们将明确的 [] 作为参数传递给 test_func() 的时候,就不会使用 test_func 的默认值,所以函数返回的是我们期望的值。

在自定义函数的特殊属性中,有个「 __defaults__」 会以元组的形式返回函数的默认参数。下面我们就用「 __defaults__」来演示一下,以便让大家有个更直观的感觉:

>>> test_func.__defaults__ #还未调用([],)>>> test_func() # 第 1 次['rocky0429']>>> test_func.__defaults__ # 第 2 次的默认值(['rocky0429'],)>>> test_func() # 第 2 次['rocky0429', 'rocky0429']>>> test_func.__defaults__ # 第 2 次的默认值(['rocky0429', 'rocky0429'],)>>> test_func([]) # 输入确定的 []['rocky0429']>>> test_func.__defaults__ # 此时的默认值(['rocky0429', 'rocky0429'],)

那么上面那种情况该如何避免呢?毕竟我们还是希望在每次调用函数的时候都是初始化的状态的?这个也很简单,就是将 None 指定为参数的默认值,然后检查是否有值传给对应的参数。所以对于文章开始的那个例子,我们可以改成如下的形式:

def test_func(default_arg=None):    if not default_arg:        default_arg = []    default_arg.append('rocky0429')    return default_arg

以上,完美解决。

●有趣的 Python 特性 2 | 一个你绝对猜不到的结果。

●有趣的 Python 特性 1 | 是谁吃掉了我的外部变量?

●有趣的 Python 特性 0 | 同样都是捕获异常,为啥要不一样呐?

●扔掉压缩工具,让我们用 Python 管理压缩包。

python 默认参数_有趣的 Python 特性 3 | 当心默认可变参数这个大猪蹄子。相关推荐

  1. python意外退出_有趣的Python上下文管理器

    阅读耗时:9分钟 目录 编写自定义上下文管理器 从生成器到上下文管理器 将上下文管理器编写为装饰器 嵌套式上下文管理器 组合式上下文管理器 利用用上下文管理器创建SQLAlchemy session ...

  2. python处理照片_有趣的Python图片处理

    萌新今天学习了嵩天老师的Python数据分析与展示,来写点记录.首先需要对图像有所了解,图像由RGB组成,红色.绿色.蓝色. 安装 这一节主要讲Python的PIL库,下载地址Python Imagi ...

  3. python函数设置默认参数_深入讲解Python函数中参数的使用及默认参数的陷阱

    这篇文章主要介绍了Python函数中参数的使用及默认参数的陷阱,文中将函数的参数分为必选参数.默认参数.可变参数和关键字参数来讲,要的朋友可以参考下 C++里函数可以设置缺省参数,Java不可以,只能 ...

  4. python turtle 绘图速度用函数会快吗_有趣的Python turtle绘图

    专 题 Feature Story 16 \ China Science & Technology Education 文 _ 毛京宇/北京师范大学第三附属中学 魏云靖/北京市师达中学 有趣的 ...

  5. python编有趣的小程序_有趣的python小程序

    有趣的python小程序 1.密码生成器x=int(input()) print(''.join(__import__('random').choice('QWERTYUIOPASDFGHJKLZXC ...

  6. python中什么是可变参数_详解Python的三种可变参数

    详解Python的三种可变参数 可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中, ...

  7. python中函数的可变参数_简单谈谈Python中函数的可变参数

    前言 在Python中定义函数,可以用必选参数.默认参数.可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数和关键字参数. ...

  8. python什么是可变参数_详解Python的三种可变参数

    可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中,在函数内部会自动认为是一个元组或 ...

  9. 用python做数据挖掘_你用 Python 做过什么有趣的数据挖掘项目?

    有网友在知乎提问:「你用 Python 做过什么有趣的数据挖掘项目?」 我最近刚开始学习 Python, numpy, scipy 等, 想做一些数据方面的项目,但是之前又没有这方面的经验.所以想知道 ...

最新文章

  1. 计算机文字识别的过程包括哪些步骤,电脑上的文字识别工具怎么使用?
  2. oracle 效率问题,Oracle【诡异】的效率问题
  3. python哪些类型可以作为迭代器_详解Python迭代和迭代器
  4. 【机器学习】粗糙集属性约简算法与mRMR算法的本质区别
  5. springmvc 传对象报400_那么火的SpringMVC到底有什么过人之处呢
  6. 【Pytorch神经网络基础理论篇】 01 从零开始介绍深度学习算法和代码实现
  7. 前端httpd+keepalived加后端heartbeat+nfs+drbd实现httpd服务的高效应用及资源统一管理...
  8. 保证elementUI组件文本域内容为json
  9. 十大经典排序算法3(Python版本)
  10. Java Java Java
  11. Linux:程序设计
  12. 彻底清理c盘空间,本人亲测有效--WinDirStat
  13. 【渝粤题库】陕西师范大学180102 广告策划 作业(高起专)
  14. 数学之美——自然常数e小故事和宇宙第一公式
  15. 【题解】【AcWing】3505. 最长ZigZag子序列
  16. win10无线网不能连接到服务器,win10无线网为什么连不上?win10连不上无线网络的修复方法...
  17. 关于电阻的通流能力思考
  18. noip冲刺计划(no regrets,no fear)
  19. 解决树莓派鼠标延迟/迟滞问题解决
  20. 数据结构与算法是什么?

热门文章

  1. ASP.NET 2.0新特性视频教程下载
  2. linux无法访问443端口,linux – 为什么我无法在Ubuntu上ping端口443?
  3. mysql fetch rows_差异mysql_fetch_array()和mysql_fetch_rows()函数_mysql
  4. linux 命令 which whereis whatis locate find
  5. 单例模式在JDK应用的源码分析
  6. JSON(JavaScript Object Notation) 格式
  7. 机器学习之数理统计与参数估计的相关知识总结
  8. java.lang.IllegalArgumentException: Does not contain a valid host:port authority: ignorethis
  9. Linux: shell命令 eval (有图有代码有真相!!!)
  10. 第二季1:图像基础知识