2020/8/17更新
事情比我想象的要麻烦。。。还是我大意了。
这次同事是周日下午发来的邮件,表示拼接结果的顺序错了:
我重新看回代码,发现情况是这样的:
- 函数的定义是:
- 调用情况:
主函数里要缺省new_path调用,递归里又是要带参数的。那我上次让它每次都清空new_path!当然!不!对!了!
我同事自己十分机智地改成了下面这样,但是他的问题来了:为啥这样能对?
这个很好理解,带参调用的时候,用的是实际的参数,不带参调用的时候,用的是new_path=[]这个的值,那么就完美实现了清空。new_path接下来变成了局部变量,所以下次再缺省调用时,并不会用到一个所谓的有“案底”的值。
看下面这个例子:
def test_default(str1, li = []):
print(li)
li = li or []
print("li:\n")
print(li)
print(str1)
for i in range(2):
li.append(5)
return li
str1 = "test default parameter:"
print("\n===============================\n")
print(test_default(str1))
print("\n===============================\n")
print(test_default(str1,[1,2]))
print("\n===============================\n")
print(test_default(str1))
print("\n===============================\n")
print(test_default(str1))
输出结果:
与预想的一致,多次调用并没有影响。
当然,如果是我,在主函数调用时,直接给一个 [] 就好了,何必绕缺省函数啥的。。。。
原文 2020/8/13
事情的起因是昨晚哦不,今天0:45分,生产的同事发给我一封邮件。
作为一个Python爱好者,我亲爱的同事致力于用python解决生产中遇到的小问题。这次的问题与测序拼接有关。算法我们略去(其实是偏重生物信息学,我懒得写了。。。)。
好了,总之他的问题就是:
看到list嘛,首先看循环。最后,我发现问题出在:
红圈的语句是我加的。这样的错误有两处。。。令人窒息有没有,缺省参数怎么能用可变类型呢。。。
看下面这个例子:
def test_default(str, li = []):
print(str)
for i in range(5):
li.append(5)
return li
def test_normal(str):
print(str)
li = []
for i in range(5):
li.append(5)
return li
str1 = "test default parameter:"
str2 = "test local parameter:"
print(test_default(str1))
print(test_normal(str2))
print(test_default(str1))
print(test_normal(str2))
输出结果是:
为啥第二次执行test_default会保存了上一次的数据呢???
理由:
希望我同事可以满意。。。希望他不要半夜再发邮件给我了。。。希望他这种问题不要憋一个星期再半夜发邮件问我了。。