前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python新手常见错误之默认值设定错误

Python新手常见错误之默认值设定错误

作者头像
小小科
发布2018-05-04 16:46:46
8490
发布2018-05-04 16:46:46
举报
文章被收录于专栏:北京马哥教育

文章来源 |伯乐在线

云豆贴心提醒,本文阅读时间5分钟,文末有秘密!

Python初学者通常会犯一些错误,甚至会因此损失很大的自信心。

不过你不必过多的担心这件事情,因为大部分人在这个时期都会犯错,而且通常都会在相似的地方犯错。

总结过一些初学者常出现的错误之后,我决定将其中一些作为例子分享出来,以帮助大家认识并解决这些错误。

今天分享的这个错误,是用一个可变值作为默认值。

产生这种BUG的原因很微妙,而且通常很难检查出来。

请看下面的例子:

在这里,我们定义了一个 list (默认为空),给它加入9并且打印出来。

此时代码运行正常。

可是当我们不输入number 参数来调用 foo 函数时,神奇的事情发生了:

这到底是什么原因?

原因在于,在Python里,函数的默认值是在函数定义的时候实例化的,而不是在调用的时候。

那么我们仍然会问,为什么在调用函数的时候这个默认值却被赋予了不同的值?

因为在你每次给函数指定一个默认值的时候,Python都会存储这个值。如果在调用函数的时候重写了默认值,那么这个存储的值就不会被使用。

当你不重写默认值的时候,Python就会让默认值引用存储的值(这个例子里的numbers)。

它并不是将存储的值拷贝来为这个变量赋值。这个概念可能对初学者来说,理解起来会比较吃力,所以可以这样来理解:

有两个变量,一个是内部的,一个是当前运行时的变量。

我们有两个变量来用相同的值进行交互,所以一旦 numbers 的值发生变化,也会改变Python里面保存的初始值的记录。

我们可以采用如下解决方案:

通常,当人们听到这里,大家会问另一个关于默认值的问题。

请看案例:

当我们运行它的时候,其结果完全是我们期望的:

这又是什么原因?

其秘密不在与默认值被赋值的时候,而是这个默认值本身。

整型是一种不可变的变量。

跟 list 类型不同,在函数执行的过程中,整型变量是不能被改变的。

当我们执行 count+=1 这句话时,我们并没有改变 count 这个变量原有的值。而是让 count 指向了不同的值。

可是,当我们执行 numbers.append(9) 的时候,我们改变了原有的 list 。因而导致了这种结果。

下面是在函数里使用默认值时会碰到的另一种相同问题:

跟前面一样,time.time() 的值是可变的,那么它只会在函数定义的时候计算,所以无论调用多少次,都会返回相同的时间 — 这里输出的时间是程序被Python解释运行的时间。

这个问题和它的解决方案在 Python 2.x 和 3.x 里都是类似的,在Python 3.x 里面唯一的不同,是里面的print 表达式应该是函数调用的方式(print(numbers))。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 马哥Linux运维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 云豆贴心提醒,本文阅读时间5分钟,文末有秘密!
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档