记录遇到的Python陷阱和注意点
最近使用Python的过程中遇到了一些坑,例如用 datetime.datetime.now() 这个可变对象作为函数的默认参数,模块循环依赖等等。 在此记录一下,方便以后查询和补充。 避免可变对象作为默认参数 在使用函数的过程中,经常会涉及默认参数。在Python中,当使用可变对象作为默认参数的时候,就可能产生非预期的结果。 下面看一个例子: def append_item(a = 1, b = []): b.append(a) print b append_item(a=1) append_item(a=3) append_item(a=5) 结果为: [1] [1, 3] [1, 3, 5] 从结果中可以看到,当后面两次调用 append_item 函数的时候,函数参数b并没有被初始化为 [] ,而是保持了前面函数调用的值。 之所以得到这个结果,是因为在Python中, 一个函数参数的默认值,仅仅在该函数定义的时候,被初始化一次 。 下面看一个例子证明Python的这个特性: class Test(object): def __init__(self): print("Init Test") def arg_init(a, b = Test()): print(a) arg_init(1) arg_init(3) arg_init(5) 结果为: Init Test 1 3