学习日记
python 默认参数工作机制
Default values are computed once, then re-used.
默认参数只会计算一次,不会重复使用
class demo_list: def __init__(self, l=[]): self.l = l def add(self, ele): self.l.append(ele) def appender(ele): obj = demo_list() obj.add(ele) print obj.l if __name__ == "__main__": for i in range(5): appender(i) [0] [0, 1] [0, 1, 2] [0, 1, 2, 3] [0, 1, 2, 3, 4]
函数也是对象,因此定义的时候就被执行,默认参数是函数的属性,它的值可能会随着函数被调用而改变。
Functions in Python are first-class objects, and not only a piece of code.
1 def a(): 2 print "a executed" 3 return [] 4 5 def b(x=a()): 6 print "id(x): ", id(x) 7 x.append(5) 8 print "x: ", x 9 10 for i in range(2): 11 print "-" * 15, "Call b()", "-" * 15 12 b() 13 print b.__defaults__ 14 print "id(b.__defaults__[0]): ", id(b.__defaults__[0]) 15 16 for i in range(2): 17 print "-" * 15, "Call b(list())", "-" * 15 18 b(list()) 19 print b.__defaults__ 20 print "id(b.__defaults__[0]): ", id(b.__defaults__[0]) 21 22 23 a executed 24 ————— Call b() ————— 25 id(x): 4316528512 26 x: [5] 27 ([5],) 28 id(b.__defaults__[0]): 4316528512 29 ————— Call b() ————— 30 id(x): 4316528512 31 x: [5, 5] 32 ([5, 5],) 33 id(b.__defaults__[0]): 4316528512 34 ————— Call b(list()) ————— 35 id(x): 4316684872 36 x: [5] 37 ([5, 5],) 38 id(b.__defaults__[0]): 4316528512 39 ————— Call b(list()) ————— 40 id(x): 4316684944 41 x: [5] 42 ([5, 5],) 43 id(b.__defaults__[0]): 4316528512
浙公网安备 33010602011771号