Python的insert方法返回None?

11
#!/usr/bin/python

numbers = [1, 2, 3, 5, 6, 7]

clean = numbers.insert(3, 'four')

print clean
# desire results [1, 2, 3, 'four', 5, 6, 7]
我得到了“None”。我做错了什么?
4个回答

20

列表的变异方法通常会返回None,而不是您期望的修改后的列表--这种方法通过原地修改列表来执行其效果,而不是构建并返回一个新列表。 因此,print numbers而不是print clean将向您显示已更改的列表。

如果您需要保持numbers不变,首先要复制它,然后再修改复制品:

clean = list(numbers)
clean.insert(3, 'four')

这将产生您所期望的总体效果:numbers 未改变,clean 是已更改的列表。


1
我发现这个解决方案很有用,谢谢。但是我想知道为什么要使用list(numbers)来创建clean,而不直接使用已经是列表类型的numbers呢? - Francis
1
我确切地说过:“如果你需要保持数字不变,首先要复制一份,然后再修改复制品”。numbers是一个列表,但是除非你复制它,否则你会改变那个列表;而且似乎OP想要在保持原始列表不变的同时创建一个更改后的副本。 - Alex Martelli
1
作为Python的初学者,我曾认为仅对变量clean进行赋值操作就可以直接复制numbers,因此对clean的后续操作不会影响到numbers - Francis
1
@Fredom,不,这在Python(以及Java、Javascript和大多数现代语言中)是一项绝对关键的问题:赋值操作不会创建一个副本,而只是将右侧对象的一个引用添加进去。这仅适用于可变对象,但当然,Python列表(像Java和Javascript数组一样)是可变的!-) - Alex Martelli
谢谢提醒!虽然这只是基础,但我发现 clean = numbers[:]clean = copy(numbers) 的作用是相同的。 - Francis
@Fredom,是的,有很多方法可以进行浅拷贝(尽管要调用名为copy的全局变量,您还需要非常特殊的导入)。我喜欢通用的方法typename(typeinstance),因为它可以以非常通用的方式工作(listdictset和许多其他类型),并且即使实例不完全是您命名的类型,例如list(someset)也可以轻松创建一个与集合相同的项目列表,没有任何问题或麻烦。 - Alex Martelli

11

insert方法会直接修改列表,且不会返回新的引用。尝试使用以下代码:

>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers.insert(3, 'four')
>>> print numbers
[1, 2, 3, 'four', 5, 6, 7]

3

list.insert()操作符不会返回任何内容,你可能需要使用以下代码:

print numbers

1

insert会将项目插入给定的列表中。如果打印数字,您将看到结果。insert不会返回新列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接