广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python函数的默认参数为什么不可以定义可变类型
  • 798
分享到

python函数的默认参数为什么不可以定义可变类型

2023-06-29 03:06:25 798人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“python函数的默认参数为什么不可以定义可变类型”,在日常操作中,相信很多人在Python函数的默认参数为什么不可以定义可变类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python函

这篇文章主要介绍“python函数的默认参数为什么不可以定义可变类型”,在日常操作中,相信很多人在Python函数的默认参数为什么不可以定义可变类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python函数的默认参数为什么不可以定义可变类型”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

函数的默认参数请勿定义可变类型

经常会看到这样一句代码警告:

Default argument value is mutable

意思是告诉我们函数的定义中,使用可变类型做默认参数。

那为什么会有这个警告呢?

可变类型和不可变类型

  • 可变类型(mutable):列表,字典

  • 不可变类型(unmutable):数字,字符串,元组

定义可变类型会有什么问题?

def fun(a=[]):    a.append(1)    print(a)if __name__ == "__main__":    fun()    fun()>>> [1]    [1, 1]

可以发现,默认参数定义可变类型之后,在第二次乃至更多次地调用同一个函数时,默认参数仿佛失去了效果。

此时,在需要重复调用同一个函数的场景中,就非常容易导致问题,并且该问题不易察觉。在debug的时候就会表现成明明没有参数传进来,但是函数参数会有值,并且执行了不应该执行的操作。

导致的原因

我的理解:

我们定义的函数本身是一个function的实例化对象,每当我们进行函数的定义时,就是创建了一个function的实例化对象,而默认参数就是其属性。

在没有传入参数,以默认参数形式调用,并且改变了函数对象的属性值时,改变的属性值被保存下来,当第二次调用同一个对象时,属性值已经发生了改变。

type(fun)>>> function

解决方法

def fun(a=None):    if a is None:    a = []    a.append(1)    print(a)if __name__ == "__main__":    fun()    fun()>>> [1]    [1]

关于可变类型作为默认参数时的注意点

请先看代码,看看代码的输出是否和你想的一样。

def e(v,l=[]):    l.append(v)    return ll1=e(10)l2=e(123,[])l3=e("a")print(l1,l2,l3)# 输出: ([10, 'a'], [123], [10, 'a'])

关于上述代码,标准解释是:带有默认参数的表达式在函数被定义的时候被计算,不是在调用的时候计算。

我觉得通俗的解释是:当不传默认值的时候,无论调用多少次该函数,在函数体内部使用的一直都是那个默认的“l”,而这个默认的“l”又是可变类型,所以,它的改变会影响所有指向它的变量,也就是l1和l3。

为了使以上两点的观点更加站的住脚,我进行以下几个测试

测试:将可变类型列表换为字典

def e(k,v,d={}):    d[k]=v    return dd1=e(10,10)d2=e(123,123,{})d3=e("a","a")print(d1,d2,d3)# 输出:({'a': 'a', 10: 10}, {123: 123}, {'a': 'a', 10: 10})

测试:来个不可变类型字符串

def e(v,s=""):    s = s+v    return ss1=e("我")s2=e("a","")s3=e("是")print(s1,s2,s3)# 输出: 我 a 是

其实以上类型都已经说明问题了,但是写个文章不容易,我决定用元祖包列表,看看修改这个列表中的数据会怎样。

实际上是不用测试的,最终打印出来的数据一定是类似**“可变类型时的操作”**时的输出的。

为什么?因为我没有修改元祖本身,修改的是其可变类型列表啊。

不能扯远了,不然扯到深拷贝,浅拷贝了。

测试:元祖包个列表来

def e(v,t=([],)):  # 传递有元素的元祖的时候要记得带逗号哦。        t[0].append(v)    # t = t[0].append(v)     要知道t[0].append(v)是没有返回值的,t会指向None,如果这样返回,外部打印的全部为None,所以不可以这样返回。    # 而且 如果你想 t[0]= t[0].append(v) 也是不行的,为啥?你在ipython中输入 dir(())你就知道了。    # 好吧,其实是因为元祖是可读不可写的。它能切片、遍历就已经很不错了。。。。。    return tt1=e("我")t2=e("a",([],))t3=e("是")print(t1,"\n",t2,"\n",t3)# 输出:# (['我', '是'],) # (['a'],) # (['我', '是'],)

到此,关于“python函数的默认参数为什么不可以定义可变类型”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: python函数的默认参数为什么不可以定义可变类型

本文链接: https://www.lsjlt.com/news/322350.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python函数的默认参数为什么不可以定义可变类型
    这篇文章主要介绍“python函数的默认参数为什么不可以定义可变类型”,在日常操作中,相信很多人在python函数的默认参数为什么不可以定义可变类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python函...
    99+
    2023-06-29
  • python函数的默认参数请勿定义可变类型详解
    目录函数的默认参数请勿定义可变类型可变类型和不可变类型定义可变类型会有什么问题?导致的原因解决方法关于可变类型作为默认参数时的注意点测试:将可变类型列表换为字典测试:来个不可变类型字...
    99+
    2022-11-13
  • python的可变和不可变数据类型是什么
    这篇文章主要讲解了“python的可变和不可变数据类型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python的可变和不可变数据类型是什么”吧!不可变数据类型python中不可变数据...
    99+
    2023-06-02
  • 为什么numpy对象是Python数据分析中必不可少的数据类型?
    在Python中,NumPy是一种非常重要的数据类型,尤其在数据分析领域中,它的作用更为突出。那么,为什么NumPy对象是Python数据分析中必不可少的数据类型呢?本文将从以下几个方面进行阐述。 一、NumPy的基本介绍 NumPy是Py...
    99+
    2023-07-20
    数据类型 numy 对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作