专栏名称: 马哥Linux运维
马哥linux致力于linux运维培训,连续多年排名第一,订阅者可免费获得学习机会和相关Linux独家实战资料!
目录
相关文章推荐
InfoQ架构头条  ·  Agoda 的非常规客户端优先迁移:从 ... ·  1 周前  
51好读  ›  专栏  ›  马哥Linux运维

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

马哥Linux运维  · 公众号  · 运维  · 2017-03-04 08:01

正文


  文章来源 |伯乐在线



云豆贴心提醒,本文阅读时间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))。






    今日值班: 马哥教育二号女神学习顾问,可甜蜜贴心沟通,可严谨职业指导,爱水果也爱生活,会创意更爱学习,陪伴你的成长之路。

内容沟通、职业成长和课程学习,可添加学习顾问:

    【扫一扫即可撩】


特别提醒

马哥教育Linux精英班(23期)-2017年3月20日(开班),开课倒计时16天优惠

福利一:课程开班,报名即可送马哥精心编制实体书一本【每日限额】;

福利二:课程开班,赠送马哥教育云学堂智能化学习系统权限1个价值1999元)和线下真实企业级服务器使用资格(价值2999元)【仅限本期】;