Pulpcode

捕获,搅碎,拼接,吞咽

0%

python默认参数和局部变量的两个坑

最近琐事一堆,没时间更新博客,忙完了这段时间在好好填坑吧。

这里写一篇关于python的两个坑。

函数默认参数

先说结论,我们的函数,如果传入的参数是一个容器,那么应该以这样的方式设置默认值:

1
2
3
4
def foo(li=None):
xxxx
xxxx
....

而不是这种方式:

1
2
3
4
def bar(li=[]):
xxxx
xxxx
....

浮现坑

1
2
3
4
5
6
7
8
9
10
def foo(li=[]):
li.append(1)
return li

def main():
a = foo()
print a
foo()
foo()
print a

当你执行main的时候,得到的结果是:

1
2
3
4
>>> main()
[1]
[1, 1, 1]
>>>

原理

实际上,你已经发现,li这个默认值被保留了,那么保留到哪里了?
当你使用dir(foo)的时候,你会发现一个这样的属性func_defaults,而这个属性正是保存默认值的地方,你将其打印,就会得到结果:

1
2
3
>>> foo.func_defaults
([],)
>>>

所以实际上func_defaults是一个固定值,你多次执行,实际上就在改变这个默认值。

局部变量

先说结论,只要在你的局部变量中,出现了定义变量的语句(类似a=5),
那么全局变量将不会在被访问到。

1
2
3
4
5
6
a = 5
def bar():
if 1 == 1:
print a
else:
a = 6

上面这段代码会报错local variable 'a' referenced before assignment

所以说,即使else的部分按照逻辑上是被枝剪,不会执行的,但毕竟是定义了变量,所以不会被执行。