当前位置: 首页 > article >正文

默认参数 d = {} 的陷阱

默认参数 d = {} 的陷阱

  • 问题需求
  • 思路
  • 代码实现
  • 默认参数d = {}的陷阱
  • 解决办法
    • 1、在函数外为每个字符串创建空字典统计词频
    • 2、函数改为每次调用时创建新字典,避免数据污染
  • 举一反三

问题需求

统计两个字符串的中文词语出现次数

思路

先使用jieba库分词功能处理字符串,再用字典统计词频

代码实现

# 导包、设置变量
import jieba as j
str1 = "默认参数"*20
str2 = "默认变量"*10
print(str1)
print(str2)

输出

默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数
默认变量默认变量默认变量默认变量默认变量默认变量默认变量默认变量默认变量默认变量
# 定义统计词频的函数
def get_amount(str_,d = {}):for word in j.lcut(str_):d[word] = d.get(word,0) + 1return d
# 调用函数统计两个字符串词频
words_num1 = get_amount(str1)
words_num2 = get_amount(str2)
print(words_num1)
print(words_num2)

输出

Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\walfar\AppData\Local\Temp\jieba.cache
Loading model cost 0.624 seconds.
Prefix dict has been built successfully.
{'默认': 30, '参数': 20, '变量': 10}
{'默认': 30, '参数': 20, '变量': 10}

最后统计结果是对两个字符串所有词语的词频统计

默认参数d = {}的陷阱

Python 函数中的默认参数会在函数定义时初始化一次,而非每次调用时重新创建。当连续调用 get_amount(str1)和get_amount(str2)时,第二次调用会 复用第一次调用后的字典,两次的返回值都是d,words_num1 和 words_num2指向的都是字典d的地址?

做个实验:

def test(d = {}):d["666"] = d.get("666",0) + 1return d
a = test()
print("第一次调用,变量a存储内容",a)
b = test()
print("第二次调用,变量a存储内容",a)
print("第二次调用,变量b存储内容",b)
c = test()
print("第三次调用,变量a存储内容",a)
print("第三次调用,变量b存储内容",b)
print("第三次调用,变量c存储内容",c)
print("a b c 三个变量的地址:","\n",id(a),"\n",id(b),"\n",id(c))

输出

第一次调用,变量a存储内容 {'666': 1}
第二次调用,变量a存储内容 {'666': 2}
第二次调用,变量b存储内容 {'666': 2}
第三次调用,变量a存储内容 {'666': 3}
第三次调用,变量b存储内容 {'666': 3}
第三次调用,变量c存储内容 {'666': 3}
a b c 三个变量的地址: 2099268147584 2099268147584 2099268147584

解决办法

1、在函数外为每个字符串创建空字典统计词频

# 导包、设置变量
import jieba as j
str1 = "默认参数"*20
str2 = "默认变量"*10
print(str1)
print(str2)
words_num1 = {}
words_num2 = {}
# 定义统计词频的函数
def get_amount(str_,d):for word in j.lcut(str_):d[word] = d.get(word,0) + 1
get_amount(str1,words_num1)
get_amount(str2,words_num2)
print(words_num1)
print(words_num2)

输出

默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数
默认变量默认变量默认变量默认变量默认变量默认变量默认变量默认变量默认变量默认变量
{'默认': 20, '参数': 20}
{'默认': 10, '变量': 10}

统计结果符合预期

2、函数改为每次调用时创建新字典,避免数据污染

# 导包、设置变量
import jieba as j
str1 = "默认参数"*20
str2 = "默认变量"*10
print(str1)
print(str2)
# 定义统计词频的函数
def get_amount(str_,d=None):if d is None:d = {}for word in j.lcut(str_):d[word] = d.get(word,0) + 1return d
words_num1 = get_amount(str1)
words_num2 = get_amount(str2)
print(words_num1)
print(words_num2)

输出

默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数默认参数
默认变量默认变量默认变量默认变量默认变量默认变量默认变量默认变量默认变量默认变量
{'默认': 20, '参数': 20}
{'默认': 10, '变量': 10}

结果同样符合预期

举一反三

默认参数 d = {} 有陷阱,那么默认参数为空字符串、空列表 string = “” list = [],是否同样存在陷阱?

# 任务要求 两两拼接字符串
str1 = "你干嘛"
str2 = "哎呦"
str3 = "诞生于1996"
str4 = "梦想做说唱领袖"# 定义拼接字符串函数
def put_together(s1,s2,s=""):s = s + s1+s2return s
caixukun = put_together(str1,str2)
print(caixukun)
wangziyi = put_together(str3,str4)
print(wangziyi)

输出

你干嘛哎呦
诞生于1996梦想做说唱领袖

打印id

print(id(caixukun))
print(id(wangziyi))
2099268620528
2099362636720

不存在数据污染问题
默认参数 s=“” 的不存在陷阱?还是我的实验设置有问题?

下面测试默认参数为空列表的情况

# 任务要求 两两将字符串放入两个列表中
str1 = "你干嘛"
str2 = "哎呦"
str3 = "诞生于1996"
str4 = "梦想做说唱领袖"# 定义拼接字符串函数
def put_in_list(s1,s2,ls = []):ls.append(s1)ls.append(s2)return ls
caixukun = put_in_list(str1,str2)
print(caixukun,id(caixukun))
wangziyi = put_in_list(str3,str4)
print(wangziyi,id(wangziyi))

输出

['你干嘛', '哎呦'] 2099362695808
['你干嘛', '哎呦', '诞生于1996', '梦想做说唱领袖'] 2099362695808

默认参数为空列表的情况存在陷阱

相关文章:

默认参数 d = {} 的陷阱

默认参数 d {} 的陷阱 问题需求思路代码实现默认参数d {}的陷阱解决办法1、在函数外为每个字符串创建空字典统计词频2、函数改为每次调用时创建新字典,避免数据污染 举一反三 问题需求 统计两个字符串的中文词语出现次数 思路 先使用jieba库分词功能处理字符串…...

Python 常用内建模块-argparse

目录 argparse 小结 argparse 在命令行程序中,经常需要获取命令行参数。Python内置的sys.argv保存了完整的参数列表,我们可以从中解析出需要的参数: # copy.py import sys print(sys.argv) source sys.argv[1] target sys.argv[2] # TOD…...

案例5_3: 6位数码管静态显示

文章目录 文章介绍效果图仿真图复习知识:代码思考 文章介绍 第5章 学习数码管,使用6位数码管进行静态显示 效果图 仿真图 新建一个干净的5_3文件夹,用于存放新画的仿真图 除单片机最小系统外,新增3个元器件,分别是&…...

Profinet转Modbus RTU/TCP以太网通讯处理器

Profinet转Modbus RTU/TCP以太网通讯处理器 在当今的工业自动化领域,各种通讯协议和标准层出不穷。 其中,Profinet和Modbus作为两种广泛应用的通讯协议,分别在不同的应用场景中发挥着重要作用。 然而,当需要将这两种协议进行转换…...

3倍训练速度+40%显存节省!Mamba+Transformer 仅用一半时间,性能提升80%!

在人工智能领域,Mamba与Transformer的结合正在成为研究热点,为自然语言处理和多模态任务带来新的突破。 最新研究表明,通过将Mamba架构与Transformer的强大编码能力相结合,模型在处理复杂的多模态数据时的效率提升了50%&#xff…...

春秋云境刷题1

CVE-2022-29464 靶标介绍: WSO2文件上传漏洞(CVE-2022-29464)是Orange Tsai发现的WSO2上的严重漏洞。该漏洞是一种未经身份验证的无限制任意文件上传,允许未经身份验证的攻击者通过上传恶意JSP文件在WSO2服务器上获得RCE。 Git…...

台式机电脑组装---电源

台式机电脑组装—电源 22 33 主板供电是聚集了12V,5V,3.3V的24pin CPU供电的话主要是12V的44pin供电 44pin合并之后,就是8pin 55 SATA硬盘会使用饼io口取电,从电源获取12v,5v,3.3v的电 33...

10-BST(二叉树)-建立二叉搜索树,并进行前中后遍历

题目 来源 3540. 二叉搜索树 - AcWing题库 思路 建立二叉搜索树(注意传参时用到了引用,可以直接对root进行修改),同时进行递归遍历;遍历可以分前中后三种写,也可以用标志来代替合在一起。其余详见代码。…...

蓝桥杯备考:贪心问题之淘淘摘苹果

这是淘淘摘苹果普通版&#xff0c;很可爱的一道题&#xff0c;我们不多陈述&#xff0c;直接上代码 #include <iostream> using namespace std; const int N 15; int a[N]; int main() {for(int i 1;i<10;i){cin >> a[i];}int x;cin >> x;x30;int cnt …...

VSTO(C#)Excel开发 系列目录 含源码发布

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

在 Ubuntu 下通过 Docker 部署 Nginx+PHP-FPM 服务器

引言 大家好&#xff0c;今天我们来聊聊如何在 Ubuntu 下通过 Docker 部署 Nginx 和 PHP-FPM 服务器。Docker 是一个开源的容器化平台&#xff0c;可以轻松地打包、分发和管理应用程序。而 Nginx 是一个高性能的 HTTP 服务器和反向代理服务器&#xff0c;PHP-FPM 则是 PHP 的一…...

Git使用和原理(3)

1.远程操作 1.1分布式版本控制系统 我们⽬前所说的所有内容&#xff08;⼯作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地&#xff01;也就是在你的笔记本或者 计算机上。⽽我们的 Git 其实是分布式版本控制系统&#xff01;什么意思呢&a…...

【ELK】节省存储 之 压缩存储方式调整

目录 集群版本&#xff1a; 7.17.6 解释几个概念&#xff1a; 段&#xff08;Segment&#xff09; 合并(Merge) 索引设置&#xff1a; 压缩方式(index.codec)&#xff1a; 测试设置前提条件 对比 在创建的时候指定压缩类型&#xff08;index.codec&#xff09; 对比 在…...

导出的使用

在web开发中&#xff0c;导出是很常见的一个功能&#xff0c;当我进行个人项目练习的时候&#xff0c;导出的时候无法控制列宽以及居中样式&#xff0c;后续发现导出插件无法进行修改&#xff0c;整个插件较为简便易懂的同时&#xff0c;对于EX的控制较为简陋&#xff0c;很多东…...

博客图床 VsCode + PigGo + 阿里云OSS

关键字 写博客&#xff0c;图床&#xff0c;VsCode&#xff0c;PigGo&#xff0c;阿里云OSS 背景环境 我想把我在本地写的markdown文档直接搬到CSDN上和博客园上&#xff0c;但是图片上传遇到了问题。我需要手动到不同平台上传文件&#xff0c;非常耗费时间和经历。 为了解决…...

鸿蒙开源硬件:重构万物智联生态的底层基座与未来机遇

一、从生态裂变到产业重构&#xff1a;开源鸿蒙的崛起之路 自 2020 年开源至今&#xff0c;OpenHarmony 社区以惊人的发展速度重塑智能终端操作系统格局。数据显示&#xff0c;其代码量已从初始的 700 万行激增至 1.2 亿行&#xff0c;汇聚超 8200 名开发者及 70 余家核心共建…...

C++之list类及模拟实现

目录 list的介绍 list的模拟实现 定义节点 有关遍历的重载运算符 list的操作实现 &#xff08;1&#xff09;构造函数 (2)拷贝构造函数 &#xff08;3&#xff09;赋值运算符重载函数 &#xff08;4&#xff09;析构函数和clear成员函数 &#xff08;5&#xff09;尾…...

SwinTransformer 改进:添加DoubleAttention模块提升上下文语义提取能力

目录 1. DoubleAttention模块 2. SwinTransformer + DoubleAttention 3. 完整代码 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. DoubleAttention模块 DoubleAttention 是一种用于计算机视觉任务的注意力机制,旨在通过双重注意力机制…...

在Electron中实现实时下载进度显示的完整指南

在开发Electron应用时&#xff0c;提供良好的用户体验至关重要&#xff0c;尤其是在下载大文件时。用户需要知道下载进度、预计完成时间以及当前下载速度。本文将详细介绍如何在Electron应用中实现实时下载进度显示功能&#xff0c;从主进程到渲染进程的完整流程。 技术栈是ele…...

java生成一个可以下载的word文件

在 Java 里&#xff0c;你能够借助 Apache POI 库来生成 Word 文件&#xff0c;并且实现文件下载功能。下面为你详细介绍实现步骤和示例代码。 1. 添加依赖 若使用 Maven 项目&#xff0c;需在 pom.xml 里添加 Apache POI 的依赖&#xff1a; <dependencies><depen…...

MacBook部署达梦V8手记

背景 使用Java SpringBootDM开发Web应用&#xff0c;框架有License&#xff0c;OSX加载dll失败&#xff0c;安装了Windows 11&#xff0c;只有一个C盘&#xff0c;达梦安装后因为C盘权限问题&#xff0c;创建数据库失败&#xff0c;遂采用Docker容器方式部署。 下载介质 官网在…...

外贸 B2B 平台没落?多语言批发系统正在崛起

近年来&#xff0c;全球外贸行业正在发生快速变化&#xff0c;传统的 B2B 平台正面临越来越多的挑战&#xff0c;尤其是在面对新兴的多语言批发系统时。这种变化不仅影响了供应商和买家之间的交易方式&#xff0c;也正在推动外贸行业的数字化升级和转型。今天&#xff0c;让我们…...

[spring] Spring JPA - Hibernate 多表联查 1

[spring] Spring JPA - Hibernate 多表联查 之前在 [spring] spring jpa - hibernate 名词解释&配置 和 [spring] spring jpa - hibernate CRUD 简单的学习了一下怎么使用 Hibernate 实现 CRUD 操作&#xff0c;不过涉及到的部分都是逻辑上比较简单的实现——只在一张表上…...

鸿蒙Next开发实战教程—电影app

最近忙忙活活写了不少教程&#xff0c;但是总感觉千篇一律&#xff0c;没什么意思&#xff0c;大家如果有感兴趣的项目可以私信给幽蓝君写一写。 今天分享一个电影App。 这个项目也比较简单&#xff0c;主要是一些简单页面的开发和本地视频的播放以及横竖屏切换。 页面搭建以…...

共享栈 线程局部存储 线程互斥 线程同步 消费者生产者模型

共享栈 第一个主线程会在栈区 而当其他线程创建时实在共享区动态申请的栈区 线程局部存储 __thread 关键字 与编译有关 全局变量是被线程共享的 每个线程都能看到 修改 但是如果对该全局变量加上__thread关键字后 该全局变量就不会被共享 将变量在库中的每一个线程的属…...

停车场停车位数据集,标注停车位上是否有车,平均正确识别率99.5%,支持yolov5-11, coco json,darknet,xml格式标注

停车场停车位数据集&#xff0c;标注停车位上是否有车&#xff0c;平均正确识别率98.0&#xff05;&#xff0c;支持yolov5-11&#xff0c; coco json&#xff0c;darknet&#xff0c;xml格式标注 数据集-识别停车场所有车辆的数据集 数据集分割 一共184张图片 训练组 89&am…...

【Go】运算符笔记

基本数学运算 Go 语言支持常见的 算术运算符&#xff0c;用于执行数学计算。 运算符说明加法-减法*乘法/除法%取余自增--自减 整数运算只能得到整数部分 package mainimport ("fmt""math" )func main() {go_math() }func go_math() {x, y : 8, 5fmt.Pr…...

ssm框架之mybatis框架讲解

1&#xff0c;Mybatis 1.1 Mybatis概述 1.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2…...

CEF 多进程模式时,注入函数,获得交互信息

CEF 控制台添加一函数,枚举 注册的供前端使用的CPP交互函数有哪些-CSDN博客 上篇文章,是在模拟环境,单进程中设置的,这篇文章,将其改到正常多进程环境中设置。 对应于工程中的 CEF_RENDER项目 一、多进程模式中,改写 修改步骤 1、注入函数 client_app_render.cpp 在…...

Androidstudio出现警告warning:意外的元素

这些警告信息通常与 Android SDK 或系统镜像的配置文件有关&#xff0c;可能是由于 SDK 工具或系统镜像的版本不兼容或配置文件格式发生了变化。以下是解决这些警告的步骤&#xff1a; 1. 更新 Android SDK 工具 确保你使用的是最新版本的 Android SDK 工具&#xff1a; 打开…...