remove()函数没有返回值。以b = a.remove(‘xxx’)形式使用时,a.remove(‘xxx’)没有返回值,所以b为None。
这个问题最开始是由于把文本strip().split(’ ‘)后产生的列表中含有空项引起的,形式是[…,’',…],为了把这个去掉,尝试用捕获异常来处理(有些样本不会产生这样的现象),但在打印结果的过程中发现,打印出None,所以才发现这个问题。
复现情况如下:
a_list = [['a','b','c'],['a','c','d','','e']]
for a in a_list:
print(a)
try:
a = a.remove('')
except ValueError:
a = a
print(a)
print('*'*20)
b = ['a','c','d','','e']
b.remove('')
#print(b)
print(b)
对应运行结果:
['a', 'b', 'c']
['a', 'b', 'c']
['a', 'c', 'd', '', 'e']
None
********************
['a', 'c', 'd', 'e']
之后,做了一系列测试,
测试一:
a_list = [['a','b','c'],['a','c','d','','e']]
for a in a_list:
print(a)
try:
a.remove('')
except ValueError:
a = a
print(a)
print('*'*20)
b = ['a','c','d','','e']
b.remove('')
#print(b)
print(b)
对应运行结果:
['a', 'b', 'c']
['a', 'b', 'c']
['a', 'c', 'd', '', 'e']
['a', 'c', 'd', 'e']
********************
['a', 'c', 'd', 'e']
测试二:
b = ['a','c','d','','e']
b.remove('')
print(b)
b = b
print(b)
对应运行结果:
['a', 'c', 'd', 'e']
['a', 'c', 'd', 'e']
测试三:
b = ['a','c','d','','e']
b = b.remove('')
print(b)
b = b
print(b)
对应运行结果:
None
None
然后,查了一些资料,有说明remove()函数用于移除列表中某个值的第一个匹配项,并做了其他的一些测试(地址)
a=[1,2,3,4,5]
for i in a:
if i != 2:
a.remove(i)
print(a)
结果:
[2,4]
分析:emove方法用于移除列表中某个值的第一个匹配,这个没错。但是在上述例子中,第一次循环时,i=1,因此移除1,此时list为:[2,3,4,5]
此时索引为0的元素已经变成了2,而不再是1,而循环会从索引为1的元素开始,此时 i=3,然后根据 if 的判断,3会被remove掉,元素 4 的索引位置再往前变为2,循环再次开启,从索引为 3 的地方开始,即 5,再remove掉,故此最后遗留下来的list是:[2, 4]
特别注意:True 和 1 是等同的,False 和 0 是等同的,甚至 True 和 False 也可以进行算术运算。我们在操作元素时,要特别小心!
最后,发现remove函数并没有返回值,所以会为None