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,一经查实,立即删除!

相关文章

Linux内核模块编译

Linux内核模块是一种可被动态加载和卸载的可执行程序。通过内核模块可以扩展内核功能,内核模块通常用于设备驱动、文件系统等。如果没有内核模块,需要向内核添加功能就需要自发代码、重新编译内核、安装新内核等步骤。 内核空间中不止一个程序试图访问驱动程序模块,导致一个…

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

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

1016. 部分A+B (15)

1016. 部分AB (15) 正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A 3862767,DA 6,则A的“6部分”PA是66,因为A中有2个6。 现给定A、DA、B、DB,请编写程序计算PA…

【完美解决】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…

_0_web_基础

创:18_3_2017修:20_3_2017 什么是前端?  --在浏览器中展示内容以及处理请求 什么是浏览器?   --一款能将网页内容展现给用户查看,并且让用户与网页交互的软件 什么是内核?   --渲染引擎,规…

解决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…

Pytorch报错:AttributeError: ‘version_info‘ object has no attribute ‘__version__‘

代码莫名报错:AttributeError: version_info object has no attribute __version__ 解决:pip install pyparsing2.4.7

测试人员要了解的知识

写代码  测试需要学会编程吗?  我比较建议学,不用学太深,因为测试的对象就是软件,那么它们是如何构成的还是需要做一些基本的了解。有了程序员的思维,在与开发的沟通过程中也能更好的相互理解。学哪门语言&#xf…

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

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

Bootloader传参数到Kernel

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

解决window移植到linux shell执行Python脚本提示找不到模块问题:

问题描述: 调试python工程时代码正常执行,但远程执行时,导入模块时提示找不到模块,即使模块就在当前工程目录下也不行 解决方案: 1、将工程目录添加到sys.path中 (测试有效) import sys cpat…

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

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

Linux Android 常用shell命令汇总 不断更新

文章目录 @[toc] 01 前言02 正文01 前言 Linux shell命令应该算是非常入门的东西,但是实际上在使用的时候,会遇到各种各样的问题,前几天我在我们的项目上需要做一个功能,根据进程名字杀死这个进程,下面是过程 1、我们正常需要的操作是 ps |grep xxx kill -9 xx 2、kill命…

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…

ModuleNotFoundError: No module named ‘pydensecrf‘解决办法

在运行train.py时出现了ModuleNotFoundError: No module named ‘pydensecrf’ 问题。 解决方法: //安装指令 pip install cython pip install pydensecrf

input中的disabled 和 readonly的区别

1、Readonly只针对input(text / password)和textarea有效, 而disabled对于所有的表单元素都有效, 2、但是表单元素在使用了disabled后,当我们将表单以POST或GET的方式提交的话,这个元素的值不会被传递出去, 而readonly…