lihongjie0209
2018-04-22 21:02:55 +08:00
解决这个问题,推荐再参数传递可变对象时,默认值设置为 None,在函数内部对 None 进行判断后再赋予默认值。
def test(b=None):
b = b or []
b += [1]
print(b)
test() # [1]
test() # [1]
test() # [1]
这个做法也没有问题, 但是更好的办法是:
不要修改参数!!!!!
用的时候复制一份
def test(b=[]):
var = list(b)
var += [1]
print(var)
####################### 上面的是理论部分################################
####################### 实践部分 #####################################
def test(b=None):
b = b or []
b += [1]
print(b)
这种函数真的不会出现在实际代码中, 因为这个函数一点用的没有
函数大概分三种:
1. 无副作用的查询函数: getXXX(), queryXXX()
这种函数有个特点 : 他们都有返回值.
2. 有副作用的修改函数: list.sort()
这种函数有个特点: 他们会改变调用者 /参数的状态, 但是没有返回这
3. 混血: 既有返回值又有副作用:
比如你有一个函数: getUser(id), 会返回一个 User, 但是在调用的时候它把 User 的 queryCount 属性改变了
def test(b=None):
b = b or []
b += [1]
print(b)
这个函数首先没有返回值, 其次所有的状态都发生在函数作用域之内, 你调用完之后所有的状态都被销毁, 所以也没有副作用.
所有在生产环境中如果看到这种函数,请删了吧, 真的除了增加代码量一点用都没有.