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

322b3249cc17d7a73ae5235866f83359.gif

a40c610ed58d74616be25e401e2d436c.png

本文字数: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

以上,完美解决。

d0814a18cf9788aa1d52ecfe6a99e764.gif

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI-无损检测方向速读:基于深度学习的表面缺陷检测方法综述

1 表面缺陷检测的概念 表面缺陷检测是机器视觉领域中非常重要的一项研究内容, 也称为 AOI (Automated optical inspection) 或 ASI (Automated surface inspection),它是利用机器视觉设备获取图像来判断采集图像中是否存在缺陷的技术。 1.1 传统检测的缺陷(非CNN)…

【完美解决】RuntimeError: one of the variables needed for gradient computation has been modified by an inp

正文在后面,往下拉即可~~~~~~~~~~~~ 欢迎各位深度学习的小伙伴订阅的我的专栏 Pytorch深度学习理论篇实战篇(2023版)专栏地址: 💛Pytorch深度学习理论篇(2023版)https://blog.csdn.net/qq_39237205/category_12077968.html 💚Pyt…

python正则表达式入门_Python中的正则表达式教程

本文http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 正则表达式经常被用到,而自己总是记不全,转载一份完整的以备不时之需。 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具&am…

解决ImportError: cannot import name ‘NoReturn‘报错

1、问题描述: 复现论文时,报错:ImportError: cannot import name ‘NoReturn‘ 尝试 pip install 安装 发现并没有这么简单 2、导致问题的原因 Python版本(3.6.1)与pip版本(21.2.3)不匹配。…

码农,你的35岁?

码农的35岁 最近经常听到关于这个话题的讨论 从深圳没有房到深圳4套房的同事 很突然 大家意识到自己在慢慢变老 好了 先放个图上来 当你老了的时候 更多的人敢对你提意见了 包括HR,包括老板,包括同事 然而 在年轻的时候,老板叫我们往东&#xff0…

删除win7多余的系统还原点_【Win7封装教程2019版】系列(二)必要的系统调整

这个系列更新就来说下必要的系统调整,因为在优化和清理之前,需要先对系统做一些必要的调整,以便让接下来的封装工作开展的更顺畅。本教程所有系列所有步骤都是连续连贯的,都有先后顺序的,请按照顺序来做。为了防止出现…

Bootloader传参数到Kernel

01 前言 这几天一直在考虑准备写点什么东西,本来想介绍下文件系统,不过文件系统是概念性的东西比较多,我自己也是看书摘抄的多,Bootloader传参数到Kernel,这个在我们开发中会经常遇到。 bootloader有什么用? 我突然想到,小时候去河里炸鱼,我们要自制鱼雷,把烟花里面…

python语法基础知识案例_Python 语法速览与实战清单

本文是对于 现代 Python 开发:语法基础与工程实践的总结,更多 Python 相关资料参考 Python 学习与实践资料索引;本文参考了 Python Crash Course - Cheat Sheets,pysheeet 等。本文仅包含笔者在日常工作中经常使用的,并…

dubbo管理控制台安装和使用

关于dubbo的配置使用已经配置好了简单的示例,下面先记录下dubbo管理控制台的安装和使用(用的zookeeper的注册中心),在网上找了些按照示例 dubbo管理控制台开源部分主要包含: 提供者 路由规则 动态配置 访问控制 权…

RuntimeError: CUDA error (10): invalid device ordinal

一、Python Error 在 Pytorch 读取参数时,报错 RuntimeError: cuda runtime error (10) : invalid device ordinal。 二、解决方法 造成这个错误的原因主要是本地只有一个 GPU (GPU:0),而程序中使用 GPUs:1。 因此,在程序中找到定义 devi…

C指针-这该死的嵌入式学习生涯

C指针-这该死的嵌入式学习生涯 01 前言 最近在公众号里面收到好几个同学关于嵌入式方面的咨询,再加上在知乎里面陆续推送了好几个嵌入式学习入门的问题,这次想统一整理一下,说说我这些年是如何被嵌入式按在地上摩擦的。 ​ 1、那一年夏天 200…

【YOLOV5-6.x中文注释版】整体项目代码全中文注释导航页面-By2022

1、开贴原因: YOLOV5:GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite 现在YOLOV5已经更新到6.X版本,现在网上很多还停留在5.X的源码注释上,因此特开一贴传承开源精神&#x…

学习微信公众号oauth2.0

首先看下整个步聚. 1. 后台服务器引导用户请求微信服务器, 微信服务器响应在微信浏览器提示用户是否要授权. 2. 用户同意后微信服务器返回code. 3. 微信浏览器跟据重定向redirect_uri带上code请求后面服务器. 4. 后台服务器收后code后, 用code请求微信服务器. 5. 微信服务器返回…

【YOLOV5-6.x讲解】YOLO5.0VS6.0版本对比+模型设计

主干目录: 【YOLOV5-6.x 版本讲解】整体项目代码注释导航现在YOLOV5已经更新到6.X版本,现在网上很多还停留在5.X的源码注释上,因此特开一贴传承开源精神!5.X版本的可以看其他大佬的帖子本文章主要从6.X版本出发,主要解…

【YOLOV5-6.x讲解】数据增强方式介绍+代码实现

主干目录: 【YOLOV5-6.x 版本讲解】整体项目代码注释导航现在YOLOV5已经更新到6.X版本,现在网上很多还停留在5.X的源码注释上,因此特开一贴传承开源精神!5.X版本的可以看其他大佬的帖子本文章主要从6.X版本出发,主要解…

Android Input子系统-含实例源码

Android Input子系统-含实例源码 1 Input子系统作用 Android很多外设都是用到输入输出设备,比如touchscreen,键盘,音量键等,输入 设备对应Android 框架是Android input子系统,像我们定制类比较多的,很多 需…

【数据集显示标注】VOC文件结构+数据集标注可视化+代码实现

一、效果图: 显示:代码常见报错》正文开始↓ 一、Pascal VOC数据集介绍 Pascal VOC网址:http://host.robots.ox.ac.uk/pascal/VOC/ 训练/验证数据集下载(2G):host.robots.ox.ac.uk/pascal/VOC/voc2012/VO…

tinyxml2遍历所有节点_Python实现二叉树的遍历

Outline:二叉树概念二叉树遍历(前序、中序、后序、宽度优先遍历)的迭代实现和递归实现;二叉树的深度,二叉树到leaf的所有路径。树(Tree)是一种抽象数据类型(ADT)&#xf…

如何监控NVIDIA Jetson的的运行状态和使用情况

一、NVIDIA Jetson介绍 NVIDIA Jetson是NVIDIA为新一代自主机器设计的嵌入式系统,是一个AI平台,所提供的性能和能效可提高自主机器软件的运行速度。每个系统都是一个完备的模块化系统,具备CPU、GPU、PMIC、DRAM和闪存。Jetson具备可扩展性&a…

atm取款机的简单程序代码_LeNet:一个简单的卷积神经网络PyTorch实现

前两篇文章分别介绍了卷积层和池化层,卷积和池化是卷积神经网络必备的两大基础。本文我们将介绍一个早期用来识别手写数字图像的卷积神经网络:LeNet[1]。LeNet名字来源于论文的第一作者Yann LeCun。1989年,LeNet使用卷积神经网络和梯度下降法…