思考一下下面的代码片段:
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"htmlcode">def foo(numbers=None): if numbers is None: numbers = [] numbers.append(9) print numbers通常,当人们听到这里,大家会问另一个关于默认值的问题。思考下面的程序:
def foo(count=0): count += 1 print count当我们运行它的时候,其结果完全是我们期望的:
> foo() 1 > foo() 1 > foo(2) 3 > foo(3) 4 > foo() 1这又是为啥呢?其秘密不在与默认值被赋值的时候,而是这个默认值本身。整型是一种不可变的变量。跟 list 类型不同,在函数执行的过程中,整型变量是不能被改变的。当我们执行 count+=1 这句话时,我们并没有改变 count 这个变量原有的值。而是让 count 指向了不同的值。可是,当我们执行 numbers.append(9) 的时候,我们改变了原有的 list 。因而导致了这种结果。
下面是在函数里使用默认值时会碰到的另一种相同问题:
def print_now(now=time.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))。
最新资源
- 苏芮.1991-停在我心里的温柔【福茂】【WAV+CUE】
- 苏慧伦.2020-面面Every.Side.of.Me【相信音乐】
- 群星.1991-不一样的感觉REMIX【宝丽金】【WAV+C
- 银霞.1983-《你那好冷的小手》珍藏纪念版[WAV分
- 银霞.2002-《国语巨星专辑VOL.3》2CD台湾版[WAV
- 金池刘罡《昨日情歌HQ》头版限量编号[低速原抓W
- 段奥娟.2024-23·岁碎念【白米范】【FLAC分轨】
- 顺子.2001-昨日·唯一·更多·顺子自选辑【魔岩】【
- 无印良品.1999-私藏三首·原创相对论(EP)【滚石】
- Merryland《Merryland》[FLAC/分轨][170.22MB]