最近琐事一堆,没时间更新博客,忙完了这段时间在好好填坑吧。
这里写一篇关于python的两个坑。
函数默认参数
先说结论,我们的函数,如果传入的参数是一个容器,那么应该以这样的方式设置默认值:
1 | def foo(li=None): |
而不是这种方式:
1 | def bar(li=[]): |
浮现坑
1 | def foo(li=[]): |
当你执行main的时候,得到的结果是:
1 | >>> main() |
原理
实际上,你已经发现,li这个默认值被保留了,那么保留到哪里了?
当你使用dir(foo)
的时候,你会发现一个这样的属性func_defaults,而这个属性正是保存默认值的地方,你将其打印,就会得到结果:
1 | >>> foo.func_defaults |
所以实际上func_defaults是一个固定值,你多次执行,实际上就在改变这个默认值。
局部变量
先说结论,只要在你的局部变量中,出现了定义变量的语句(类似a=5
),
那么全局变量将不会在被访问到。
1 | a = 5 |
上面这段代码会报错local variable 'a' referenced before assignment
。
所以说,即使else的部分按照逻辑上是被枝剪,不会执行的,但毕竟是定义了变量,所以不会被执行。