##python 有一种遗留的现象: 情况1:参数遗留问题
def add_end(L=[]):
L.append('end')
return L
a = [1,2,3]
print (add_end(a))
print (add_end())
print (add_end())
print (add_end())
结果
[1, 2, 3, 'end']
['end']
['end', 'end']
['end', 'end', 'end']
- 解决方法: 对参数进行判断:
def add_end(L=None):
if L == None:
L=[]
L.append('end')
return L
a = [1,2,3,4]
print(add_end(a))
print(add_end())
print(add_end())
结果
[1, 2, 3, 4, 'end']
['end']
['end']
情况二:闭包问题
- 产生原因:原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3。
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
结果
>>> f1()
9
>>> f2()
9
>>> f3()
9
- 解决方法: 方法是再创建一个函数,用该函数的参数绑定循环变量当前的值:
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
结果:
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9
** 情况一引用自廖老师的教程
** 情况二引用自廖老师的教程
codewar题目:在混有字母数字的列表中找出数字并建立列表,我的拙解。
- ** 这里我的以为L=[]会像上面那样遗留问题,因此加了判断,去掉判断一样的出正确答案**
def filter_list(l):
'return a new list with the strings filtered out'
L=[]
#if L!=None:
# L=[]
for num in l:
if isinstance(num, int):
L.append(num)
return L
- 更加简洁的的解法
def filter_list(l):
'return a new list with the strings filtered out'
return [i for i in l if isinstance(i, int)]