python3函数默认参数的坑

Python 中的默认值是什么? Python 语言具有表示函数参数的语法和默认值的不同方式。默认值指示如果在函数调用期间未给出参数值,则函数参数将采用该值。默认值是使用表单关键字名称=值的赋值 (=) 运算符分配的。 阅读详情

在定义一个函数时,有的时候会添加默认参数。如

def fun(a = 0):
    pass

但默认参数倘若不注意会跳进一个较大的坑,如

## 设置个标签 flag
def fun(L = []):
    L.append(1)
    return L

a = fun()
b = fun()

问此时a, b的值是什么。倘若认为此时的 L 为局部变量,则很容易答出a = [1], b = [1],但是应该是 a = [1, 1], b = [1, 1]
这一特性在Python的官方文档中有特别说明,位置为:入门教程/4.7.1默认参数值

文档的大意为:
默认参数在函数被定义的同时也被定义。
举个例子更加好理解:

i = 5

def fun(num = i):
    print(num)

i = 6

fun()

#=====run=====
5

对前面flag中的函数可以这样改编

l = []
def fun(L = l):
    L.append(1)

    return L

a = fun()
b = fun()

在这里将上面默认参数的值,也就是空列表具体赋给变量 l(小写L)。

接下来是python几个特性的融合:
首先默认参数在函数被定义的时候被定义,所以 L 在函数被定义的时候得到空列表的指针。
但是由于在python中可变对象的传递都是传递指针,所以在两次函数调用后 l, L, a, b 四个变量指向的都是同一个内存地址。也就是:
在这里插入图片描述

那么无论是谁对这片内存空间进行操作,四个指向此内存空间的变量都会发生改变(关于可变对象的特性建议学习c语言的指针进行更加深刻的理解,在此之前可以当作知识点背诵)

如果查看 l 的值可以发现 l 的值也和a, b一样。
在这里插入图片描述
那么回到 flag 里的函数

def fun(L = []):
    L.append(1)

    return L

a = fun()
b = fun()

道理是完全一样的:
首先默认参数在函数被定义的时候定义,所以 python 在内存中创建了一个空列表,并且让 L 指向空列表
调用两次函数后 L, a, b 指向的是同一片内存空间

在这里插入图片描述
不同的是因为并没有在全局变量中定义一个变量(如 l)指向这片空间,所以在主函数中是无法直接访问这片空间的。

备注:虽然说 L 也是指向这片内存空间的,但是因为 L 的作用域只在函数内部,所以在主函数中是没办法通过 L 访问这片内存空间。但是可以在函数内部指向此内存空间。

Python 函数参数传递避坑:3个可变默认参数陷阱与命名关键字参数应用 本文深入探讨Python函数参数传递中的三个常见陷阱,包括可变默认参数、参数顺序混乱和意外关键字参数,并介绍如何利用Python 3.8+的限定位置参数(/)和命名关键字参数(*)来构建更健壮的接口。通过实际案例和最佳实践,帮助开发者避免常见错误,提升代码质量和可维护性。 阅读详情

相关推荐

Python 函数参数传递避坑:3个可变默认参数陷阱与不可变对象原则

本文深入解析Python函数参数传递中的三个典型陷阱,特别是可变对象作为默认参数引发的数据污染问题。通过实例代码和内存管理原理,揭示位置参数与关键字参数的微妙交互,并提供使用None作为哨兵值等最佳实践方案,帮助开发者避免常见错误。

weixin_33691700的博客 418

python3函数参数(必选参数、默认参数、关键字参数、可变参数)

函数参数 形参是参数在函数定义过程中的状态,这个过程中没有赋予实际的数值,实参是参数在函数调用过程中的状态,当参数被赋予实际的数值后,它会由形参转为实参。 参数类型有:(1)必选参数(2)默认参数(3)关键字参数(4)可变参数 1.形参与实参 #name,age无值为形参 def base(name,age): print(f'{name},{age}') if __name__=='__main__': base('Lily',21) #有值为实参 if name=='mai

野猫炫的博客 6989

Python中函数的默认值参数和关键参数的使用示例

使用环境:需要先安装PyCharm(请自己百度下载安装),以及然后官网上下载Python 2.7版本,以及Python 3.7版本后,安装在自己的电脑上。 使用步骤: 1、下载解压缩之后,打开PyCharm集成开发环境, 2、然后选择“open”菜单打开项目 3、在IDE中打开test_one.py文件,右键点击“Run test_one”或者直接点击右上角的播放键。 如果一切正常,那么你会在PyCharm控制台中看到运行的效果。 阅读人员:学习Python语言的小白。 目的:帮助理解函数的默认参数和关键参数在Python中的具体使用。

python3回顾——函数部分(默认函数)

默认参数:默认参数可以简化函数的调用。设置默认参数时,有几点要注意:一是必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);二是如何设置默认参数。当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。例:def power(x, n=2): s = 1 while n > 0: ...

qq_40581264的博客 234

Cadence Allegro 17.4学习记录开始00

Cadence Allegro 有三个版本,16.6,17.2,17.4。现在主要学习最新的版本17.4.原理图设计:OrCADPCB设计:Allegro主要用到的就下面三个图片软件:PCB Editor 17.4 是用来画PCB和元器件封装的;Padstack Editor 17.4 是用来画元器件焊盘的;Capture CIS 17.4 是用来画原理图和原理图库的。其实Cadence还有很多功能,现在计划先学习以上内容,后面熟悉了这个软件,还可以继续学习放仿真等功能。

qq_31444421的博客 7443

【Qt】Window环境下搭建Qt6、MSVC2022开发环境(无需提前安装Visual Studio)

本文介绍 Windows 环境下无需安装 Visual Studio,搭建 Qt6 与 MSVC2022 开发环境的方法,以节省磁盘空间。核心步骤包括:用中科大镜像提速 Qt6 在线安装,需勾选 Qt Creator 17.0.1、MSVC 2022 x64 等组件;配置环境变量,添加 mingw_64、msvc2022_64 及 Qt Creator 的二进制目录;安装 MSVC 2022 编译器与 Windows 10 SDK 并记录版本;配置 Qt Creator 构建套件,可选设置 vcvarsal

油炸自行车的博客 2922

python def函数调用_python def 定义函数,调用函数方式

python def 定义函数,调用函数方式def sum_2_nums(a,b): #def 定义函数result = a+bprint('%d+%d=%d'%(a,b,result))num1 = int(input('请输入第一个数字:'))num2 = int(input('请输入第二个数字:'))sum_2_nums(num1,num2) #调用函数定义和调用的函数,1:个数相同 ;2...

weixin_39714113的博客 816

RK3566/RK3588 NPU性能实测:用mobilenet模型快速验证你的开发板NPU是否正常工作

本文提供了RK3566/RK3588开发板NPU性能实测指南,通过MobileNet模型快速验证NPU是否正常工作。详细介绍了环境搭建、测试资源获取、编译运行及结果分析的全流程,帮助开发者高效验证神经网络加速器功能,为后续AI应用部署奠定基础。

weixin_28826521的博客 447

python中def fun 定义函数列表_python函数

# -*- coding:utf-8 -*-#yys#python 3.7.2# 1.定义函数、调用函数# 函数:组织好的、可重复使用的、用户实现单一或者关联功能的代码段。# 函数能够提高应用的模块性和代码的重复利用率。# Python提供了很多内置的函数,比如len等等,# 另外也可以根据自己的业务需求进行用户自定义函数的创建。# 1.1 函数的定义规则# 函数代码块以 def 关键词开头,后接...

weixin_28820911的博客 6532

【运筹学】什么是基变量?对于线性规划问题中“基”概念的理解(3月3日学习笔记)

在学习《线性规划与目标规划》的过程中,课程的主讲老师郭韧给出了对于基概念的定义如下图 图片来源:运筹学(中国大学mooc网) 由此我产生了几个疑惑:1.如何理解B是线性规划问题的一个基?2.为什么说最多有CnmC_n^mCnm​个基呢?     1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基? 在回答第一个...

纸羊同学的博客 3万+

元数据管理:DataHub和OpenMetadata对比分析

DataHub和OpenMetadata都试图解决数据编目,搜索,发现,治理和质量方面的相同问题。这两种工具都是出于为需要支持大量数据源、团队和用例的大型组织解决这些问题而诞生的。尽管这些工具在发布历史和成熟度方面略有不同,但它们的功能存在显着重叠。

weixin_38030820的博客 6632

python3 函数中默认参数遇到的坑

python3 函数中默认参数遇到的坑** 一般情况下,默认参数定义为不可变类型,即指向不可变对象 python中的不可变对象如:字符串,元组,布尔,整形,浮点型 可变对象如:列表,字典,集合 看个例子: def fun_list(val,list4=[]): list4.append(val) return list4 list1 = fun_list('b') list2 =...

qq_43534980的博客 189

二相混合式步进电机闭环矢量控制simulink仿真(含仿真文件)

在位置跟踪伺服系统中二相混合式步进电机闭环矢量控制simulink仿真

qq_39023633的博客 2万+

Python3函数中默认参数的坑

默认参数有个最大的坑: 先定义一个函数,传入一个list,添加一个END再返回: def add_end(L=[]): L.append('END') return L 当你正常调用时,结果似乎不错: >>> add_end([1, 2, 3]) [1, 2, 3, 'END'] >>> add_end(['x', 'y', 'z'...

fff2zrx的博客 1300

网课、网页视频倍速播放简单脚本

一个简单的网页视频倍速脚本

huazn612的博客 1万+

非华为电脑也能用!华为电脑管家完美安装教程来了

GitHub 上有一个开源项目 ​****​,专门解决“非华为设备无法安装华为电脑管家”的问题。它通过智能模拟 + DLL 劫持技术,绕过官方对硬件型号的检测,让你在联想、戴尔、华硕甚至 DIY 主机上也能流畅使用华为电脑管家!⭐ 项目已获 ​700+ Stars​,社区活跃,持续更新,兼容性优秀!科技不该有围墙。如果你成功在非华为电脑上跑起了 PCManager,欢迎在评论区晒出你的设备型号 + 使用体验!也别忘了把这篇推文分享给同样“眼馋”华为生态的朋友 ~📱 ​关注我们。

程序员朱永胜 4917

Python 函数参数 3 大陷阱解析:可变默认参数与参数顺序的实战避坑

本文深入解析Python函数参数的三大常见陷阱,包括可变默认参数的'记忆效应'、参数顺序混乱导致的Bug以及位置参数与关键字参数混合使用的雷区。通过真实案例和解决方案,帮助开发者避免这些隐蔽错误,并提供了参数设计的最佳实践和防御性编程技巧,提升代码的健壮性和可维护性。

weixin_33797791的博客 381

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Python在函数中使用列表作为默认参数

Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

2401_84140519的博客 1163

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python函数默认参数的一些坑

一、默认参数 python为了简化函数的调用,提供了默认参数机制: 这样在调用pow函数时,就可以省略最后一个参数不写: 在定义有默认参数的函数时,需要注意以下: 必选参数必须在前面,默认参数在后; 设置何种参数为默认参数?一般来说,将参数值变化小的设置为默认参数。 python标准库实践 python内建函数: 函数签名可以看出,使用print(‘hello python’)这样的简单调用的打印...

python学习者的博客 1185

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Python之在函数中使用列表作为默认参数

  本文将介绍笔者在工作中遇到的Python的一个坑,那就是使用列表作为默认参数。   我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变。另一个需要注意的是,使用列表作为函数的默认参数时,列表的内容变化情况。   首先,我们看以下的代码例子: def add(x, lst=[]): if x not in lst: lst.appen...

山阴少年 3295

Python 函数中使用默认值参数 — 谈谈可变对象的坑?!

在 python 中定义函数,其参数可以使用多种不同的方式,其中包括 “默认值参数”类型,那么当作默认值的对象有什么限制和要求么?这里搞不好还真有坑! 接下来我们主要从两个角度来谈谈。 参数的默认值: 使用可变对象 使用不可变对象 默认参数使用可变对象会怎样? 先复原需求 定义一个函数,为传入的列表(list)尾部添加一个“end”元素。 如:传入: [1, 2, 3] 输出: [1 ,2, 3, 'end'] 实现代码: def adden...

捉虫客 de 博客 3446

Python函数默认参数设置

上面调用依然是错误的,因为第一个字符串没有指定关键字参数,因此将使用位置参数为 name 参数传入参数值,第二个参数使用关键字参数的形式再次为 name 参数传入参数值,这意味着两个参数值其实都会传给 name 参数,程序为 name 参数传入了多个参数值。上面程序中在定义 say_hi() 函数时为 name、message 形参指定了默认值,因此程序中第一次调用 say_hi() 函数时没有为 name、message 参数指定参数值,此时 name、message 参数将会使用其默认值。

hakesashou的博客 1298

Python函数的默认参数踩坑

引子 栽在 Python 的默认参数的“坑”中几次之后打算专门弄一篇博客来说一下这个事情。但是最近看到一篇很好地英文文章(Default Parameter Values in Python,Fredrik Lundh | July 17, 2008 | based on a comp.lang.python post),鞭辟入里。珠玉在前,就不舞文弄墨了。当然,也算是偷个懒,在这里简单翻译一下...

深藏功与名 1604

Python函数参数类型与默认参数

介绍了Python函数的形参(函数定义时):普通参数(位置参数)、默认参数、可变参数(可变位置参数,可变关键字参数)、命名关键字参数;实参(调用函数时):位置参数,关键字参数;以及强制关键字参数和默认参数设定。

飞鹰技术 1万+

python函数参数的默认参数、元组参数和字典参数例解

python函数除了不带参数,带固定参数之外,还有另外三类函数参数有重要使用价值,是提升python水平需要强化的内容。它们是默认参数、元组参数和字典参数。下面举例子说明。 1.默认参数 即在函数定义时赋值的参数。 #默认参数主要是为了减少重复输入的次数。 def func_default(x,y=100,z="good"): print(x,y,z) func_default(...

acflair的专栏 9856

python默认参数的坑_在python函数中默认参数的一些坑

一、默认参数python为了简化函数的调用,提供了默认参数机制:这样在调用pow函数时,就可以省略最后一个参数不写:在定义有默认参数的函数时,需要注意以下:必选参数必须在前面,默认参数在后;设置何种参数为默认参数?一般来说,将参数值变化小的设置为默认参数。python标准库实践python内建函数:函数签名可以看出,使用print('hello python')这样的简单调用的打印语句,实际上传入...

weixin_39821718的博客 187
上一篇: 单链表总结
下一篇: Java第一课
Adrian_Yan
博客等级 码龄7年 0粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值