# -*- coding: utf-8 -*-


# 默认参数： 如果调用的时候没指定，那它会是函数定义时的引用；
# 因此，默认参数建议使用基本类型；如果不是基本类型，建议写 None,然后在函数里面设默认值


##### 范例1，默认参数如果是 []、{} ，将会影响全局 ########
def t1(a, b = []):
    b.append(a)
    print('%s  %s' % (id(b), b))

# t1(1)       # 打印： 12523400  [1]
# t1(2)       # 打印： 12523400  [1, 2]
# t1(3, b=[]) # 打印： 12545000  [3]

def t2(a, b = {}):
    b[len(b)] = a
    print('%s  %s' % (id(b), b))

# t2(1)       # 打印： 12540928  {0: 1}
# t2(2)       # 打印： 12540928  {0: 1, 1: 2}
# t2(3, b={}) # 打印： 11547392  {0: 3}


##### 范例2，如果默认的是其它的函数调用，同样原理，默认值只是函数定义时的引用，后面不再改变 ########
import time
def cc(a,b = time.time()):print('%s  %s' % (a,b))

# cc(1)      # 打印： 1 1306501851.48
# cc(1,b=2)  # 打印： 1 2
# cc(2)      # 打印： 2 1306501851.48


##### 范例3，只是为了更好的理解上述所讲 ########
def aa():
    print('aa...')
    return []

# 只在函数定义时，执行被调用的 aa(), 后面不再执行
def bb(a,b = aa()):
    b.append(1)
    print('%s  %s' % (id(b), b))

# bb(1) # 打印： 12542840  [1]
# bb(2) # 打印： 12542840  [1, 1]


# ---------------------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------------------


#### 范例4， 为避免上面的出错，正确的写法是这样的：
# def t1(a, b = None):
#     b = b or []
#     b.append(a)
#     print('%s  %s' % (id(b), b))

# def t2(a, b = None):
#     b = b or {}
#     b[len(b)] = a
#     print('%s  %s' % (id(b), b))

# import time
# def cc(a, b = None):
#     b = b or time.time()
#     print('%s  %s' % (a,b))