廊坊建设网站企业,网站建设费走什么科目,专业制作标书,seo推广任务小结用一个可变的值作为默认值这是一个绝对值得放在第一个来说的问题。不仅仅是因为产生这种BUG的原因很微妙#xff0c;而且这种问题也很难检查出来。思考一下下面的代码片段#xff1a;def foo(numbers[]):numbers.append(9)print numbers在这里#xff0c;我们定义了一个 lis…用一个可变的值作为默认值这是一个绝对值得放在第一个来说的问题。不仅仅是因为产生这种BUG的原因很微妙而且这种问题也很难检查出来。思考一下下面的代码片段def foo(numbers[]):numbers.append(9)print numbers在这里我们定义了一个 list (默认为空)给它加入9并且打印出来。 foo()[9] foo(numbers[1,2])[1, 2, 9] foo(numbers[1,2,3])[1, 2, 3, 9]看起来还行吧可是当我们不输入number 参数来调用 foo 函数时神奇的事情发生了 foo() # first time, like before[9] foo() # second time[9, 9] foo() # third time...[9, 9, 9] foo() # WHAT IS THIS BLACK MAGIC?![9, 9, 9, 9]那么这是神马情况直觉告诉我们无论我们不输入 number 参数调用 foo 函数多少次这里的9应该被分配进了一个空的 list。这是错的在Python里函数的默认值实在函数定义的时候实例化的而不是在调用的时候。那么我们仍然会问为什么在调用函数的时候这个默认值却被赋予了不同的值因为在你每次给函数指定一个默认值的时候Python都会存储这个值。如果在调用函数的时候重写了默认值那么这个存储的值就不会被使用。当你不重写默认值的时候那么Python就会让默认值引用存储的值(这个例子里的numbers)。它并不是将存储的值拷贝来为这个变量赋值。这个概念可能对初学者来说理解起来会比较吃力所以可以这样来理解有两个变量一个是内部的一个是当前运行时的变量。现实就是我们有两个变量来用相同的值进行交互所以一旦 numbers 的值发生变化也会改变Python里面保存的初始值的记录。那么解决方案如下def foo(numbersNone):if numbers is None:numbers []numbers.append(9)print numbers通常当人们听到这里大家会问另一个关于默认值的问题。思考下面的程序def foo(count0):count 1print count当我们运行它的时候其结果完全是我们期望的 foo()1 foo()1 foo(2)3 foo(3)4 foo()1这又是为啥呢其秘密不在与默认值被赋值的时候而是这个默认值本身。整型是一种不可变的变量。跟 list 类型不同在函数执行的过程中整型变量是不能被改变的。当我们执行 count1 这句话时我们并没有改变 count 这个变量原有的值。而是让 count 指向了不同的值。可是当我们执行 numbers.append(9) 的时候我们改变了原有的 list 。因而导致了这种结果。下面是在函数里使用默认值时会碰到的另一种相同问题def print_now(nowtime.time()):print now跟前面一样time.time() 的值是可变的那么它只会在函数定义的时候计算所以无论调用多少次都会返回相同的时间 — 这里输出的时间是程序被Python解释运行的时间。 print_now()1373121487.91 print_now()1373121487.91 print_now()1373121487.91这个问题和它的解决方案在 Python 2.x 和 3.x 里都是类似的在Python 3.x 里面唯一的不同是里面的print 表达式应该是函数调用的方式(print(numbers))。大家应该注意到我在解决方案里用了 if numbers is None 而不是 if not numbers 。这是另一种常见的错误我准备在接下来的文章里面介绍。英文出处Amir Rachum译文出处伯乐在线 - 贱圣OMG