Python函数缺省参数的 “ 坑 ” (与C++对比学习)

        我们都知道Python函数的缺省参数可以降低我们调用函数的成本,但是一般我们的缺省参数都是不可变对象,如果是可变对象,我们对其多次调用会发生什么呢?

def func(arr=[]):arr.append('Hello')print(arr)func()
func()
func()    

        这貌似很奇怪,因为在学习C++时,打印出来的信息应该都是一致的,如下:

#include <iostream>
#include <vector>
void func(std::vector<int> arr = std::vector<int>())
{arr.push_back(1);for(auto& e : arr){std::cout << e << " ";}std::cout << std::endl;
}
int main()
{func();func();func();return 0;
}

        这是因为在C++中,只有在调用该函数的时候,才会创建对应的缺省参数的对象,所以每次调用都会在栈上创建一个新的vector对象,但是大家一定会观测到每次都地址都是一致的,但是无需担心,因为 arr 的作用域也只是在函数内部,每次调用的时候都是需要重新创建对象的。

void func(std::vector<int> arr = std::vector<int>())
{arr.push_back(1);std::cout << &arr << std::endl;
}

        在Python中,如果你定义了一个函数,并在定义函数参数的时候,为其制定了缺省参数,,那么这个缺省参数就会被维护起来,存储到了函数对象的属性中,直到程序结束或者函数对象被删除。所以我们每次调用的时候,都是在访问同一个缺省参数的对象,因为上面的缺省参数对象是一个可变对象,对其进行append操作就会改变对象的内容,所以就会观测到上面的现象了。

        我们也可以观测一下这个缺省参数对象的地址:

def func(arr=[]):arr.append('Hello')print("id = %d" % (id(arr)))# print(arr)func()
func()
func()

        我们可以观测到对象的id都是一致的,所以也可以证明这几次函数调用的缺省参数对象都是同一个

那如何解决这类问题?

def func(arr=None):if arr is None:arr = []arr.append('Hello')print("id = %d" % (id(arr)))print(arr)func()
func()
func()

        这样设计就没有问题了,因为如果arr是一个空类型None,就会在函数内部重新被赋值成list列表,而此时list列表对象的生命周期和作用域都在函数内,即调用完函数就会被销毁,所以在打印的时候即使id值相同,也是不同对象。

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

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

相关文章

定个小目标之刷LeetCode热题(40)

94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 直接上代码吧&#xff0c;中序遍历左根右 class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res new ArrayList<Integer>(…

运维锅总详解计算机缓存溢出

本文尝试从缓存溢出、如何平衡防止缓存溢出和OOM、conntrack缓存满载影响及优化措施、TCP/IP协议栈缓存满载影响及优化措施等方面对计算机缓存溢出进行详细分析&#xff0c;最后给出一些缓存满载的Prometheus告警规则。希望对您有所帮助&#xff01; 一、计算机缓存溢出简介 …

推荐定时发圈、跟圈工具

登录账号后&#xff0c;编辑好文案和图片&#xff0c;选择需要发圈的微信账号&#xff08;支持多个号哦&#xff09;和需要发圈的时间&#xff0c;点击发送即可&#xff0c;等时间一到&#xff0c;系统就会自动发送朋友圈&#xff0c;再也不用错过时间&#xff0c;可以准时准点…

JLMPack:您的文件管理新选择

在数字化时代&#xff0c;文件管理已成为我们日常生活和工作中不可或缺的一部分。无论是个人资料的整理&#xff0c;还是企业文档的管理&#xff0c;都需要一款高效、安全、易用的文件管理工具。今天&#xff0c;就让我们一起了解一款国有自主可控的文件管理工具——JLMPack。一…

Java NIO2详解:异步文件和网络编程

一、NIO2 简介 从 NIO 到 NIO.2:发展历程及优势 Java 的 I/O 模型经历了从阻塞式 I/O 到非阻塞式 I/O 的发展过程。 传统阻塞式 I/O (BIO): 早期版本中的 I/O 操作是阻塞式的,这意味着当线程执行 I/O 操作时,会一直阻塞直到操作完成。这种方式资源利用率低,难以处理高并…

PDI-kettle工具连接本地虚拟机Ubuntu上的数据库

PDI 配置ubuntu数据库配置Kettle工具 PDI版本&#xff1a;9.4 Ubuntu2204&#xff1a;10.11.8-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04 配置ubuntu数据库 安装 apt install -y mariadb-server配置监听地址 cat > /etc/mysql/mariadb.conf.d/99-kettle.cnf << EOF …

TCP/IP模型原理(理论)

TCP/IP模型 1. 网络模型简介2. 应用层2.1 URL2.1.1 urlencode和urldecode 2.2 HTTP协议2.2.1 HTTP协议格式2.2.2 HTTP问题2.2.3 HTTPS 3 传输层3.1 端口号3.2 udp3.2.1 udp协议帧格式3.2.2 udp特点3.2.3 udp缓冲区3.2.4 注意 3.3 tcp协议3.3.1 tcp协议段格式3.3.2 确认应答机制…

不可忽视 软文营销成功的三大核心要素

在品牌宣传过程中&#xff0c;软文营销作为一种高效且相对低成本的推广方式&#xff0c;备受企业青睐。然而&#xff0c;并非所有软文都能达到预期的营销效果。今日投媒网就来与您分享影响软文营销效果的三大核心因素。 一&#xff0e;内容质量&#xff1a;灵魂之所在 首先&am…

NLTK下载及其报错问题,包解决

目录 问题分析 下载 报错 报错原因 正确ip获取 写入host文件 再次下载 测试是否成功 问题分析 NLTK一般是在作自然语言处理时用到&#xff0c;最开始时&#xff0c;我是直接在conda进行conda install nltk进行安装&#xff0c;以为就可以直接使用&#xff0c;但是运行…

黄小米-从田间到餐桌的美味之旅

甘肃黄小米颗粒饱满&#xff0c;色泽金黄&#xff0c;富含多种营养成分&#xff0c;如蛋白质、膳食纤维、维生素和矿物质等。其口感香糯&#xff0c;煮粥时香气扑鼻&#xff0c;米油丰富&#xff0c;味道醇厚。由于甘肃地区独特的地理和气候条件&#xff0c;包括充足的日照、较…

速刷edurank(1)

python安全开发 python安全开发 python安全开发前言一、平台edu二、使用步骤1.引入库2.功能**完整代码**完整代码 总结 前言 目的&#xff1a;想快速的搜集edu的域名 一、平台edu https://src.sjtu.edu.cn/rank/firm/0/?page2 二、使用步骤 1.引入库 代码如下&#xff08…

使用fifo IP核,给fifo写数据,当检测到ALMOST_EMPTY时,为什么不能立即赋值

这涉及到FIFO&#xff08;先入先出缓冲器&#xff09;的内部工作机制和时序考虑。让我详细解释为什么在检测到ALMOST_EMPTY信号时不能立即向FIFO写入数据。 ALMOST_EMPTY信号的特性&#xff1a; ALMOST_EMPTY是一个预警信号&#xff0c;表示FIFO中的数据量已经接近空。这个信号…

数学建模----滑翔伞伞翼面积的设计及运动状态描述

摘要 滑翔伞作为一项融合了挑战、冒险和刺激于一体的运动&#xff0c;近年来在全球范围内受到了广泛的关注。滑翔伞在救援、探险、体育、娱乐、环保和交通等领域的应用展现了其重要价值。然而&#xff0c;中国在滑翔伞领域尚未取得突破&#xff0c;缺乏全球影响力和竞争力。因此…

基于docker的prometheus+grafana+altermanager+prometheus-webhook-dingtalk钉钉报警

一、各软件功能简介 prometheus&#xff1a;Prometheus(是由go语言(golang)开发)是一套开源的监控&报警&时间序列数 据库的组合。主要优点&#xff1a;外部依赖安装使用超简单、系统集成 多等 grafana&#xff1a;Grafana 是一款采用 go 语言编写的开源应用&#xff0…

未来已来:期待GPT-5在人工智能领域的突破与创新

GPT-5 一年半后发布&#xff1f;对此你有何期待&#xff1f; IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&#xff0c;给出了肯定答案并表示将在一年半后发布。此外&#xff0c;…

钉钉消息异常通知

钉钉消息异常通知 支持多线程 支持多进程 支持多人 支持所有人 from pprint import pprintimport requests import json import threading import multiprocessing from datetime import datetimeclass DingTalkAlert:def __init__(self, webhook_url, secretNone):self.webh…

sql查询慢的一种优化思路:尝试将多表查询转为单表查询

背景 接到一个报表优化的需求&#xff0c;该sql inner join了两张表&#xff0c;主表中数据大概是三千万&#xff0c;经测试&#xff0c;查询2023-07-01这一天的数据需要12秒&#xff0c;查询2023-07-01~2023-07-31 却只需要1.1秒&#xff0c;查询2024-07-01需要20分钟&#x…

Ubuntu安装PostgreSQL

Ubuntu(在线版) 更新软件源 sudo apt-get update 添加PostgreSQL官方数字签名 wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - 将地址添加到系统的软件包源列表中 echo "deb http://apt.postgresql.org/pub/repos/a…

MySQL数据库-Windows部署MySQL环境

Windows部署MySQL环境​​​​​​ 一、下载mysql数据库 进入MySQL官方网站&#xff08;MySQL :: MySQL DownloadsMySQL&#xff09;&#xff0c;随后按如下红框方式操作&#xff1a; ​ ​ ​ ​ 这里选择的是离线安装&#xff0c;第一个是在线安装 下载好安装包后开始…

基于Springboot的智慧养老中心管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Springboot的智慧养老中心管理系统,…