进入Python(2.7.1) 但是没有理解(数小时)这个:
>>> a = [1, 2]
>>> b = [3, 4]
>>>
>>> a.extend([b[0]])
>>> a
[1, 2, 3]
>>>
>>> a.extend([b[1]])
>>> a
[1, 2, 3, 4]
>>>
>>> m = [a.extend([b[i]]) for i in range(len(b))] # list of lists
>>> m
[None, None]
前两个扩展按预期工作,但是当在列表推导中压缩它时失败。 我做错了什么?
答案 0 :(得分:5)
extend
就地修改了列表。
>>> [a + b[0:i] for i in range(len(b)+1)]
[[1, 2], [1, 2, 3], [1, 2, 3, 4]]
答案 1 :(得分:2)
extend
的返回值为None
。
答案 2 :(得分:2)
list.extend()
扩展了列表。在就地改变对象的Python标准库方法总是返回None
(默认值);您的列表理解执行了a.extend()
两次,因此结果列表包含两个None
返回值。
你的a.extend()
来电正常工作;如果你要打印a
,它会显示:
[1, 2, 3, 4, 3, 4]
您在Python解释器中看不到None
返回值,因为解释器从不回显None
结果。您可以明确地测试它:
>>> a = []
>>> a.extend(['foo', 'bar']) is None
True
>>> a
['foo', 'bar']
答案 3 :(得分:2)
extend
函数使用您在原地提供的值扩展列表并返回None
。这就是为什么列表中有两个None
值的原因。我建议你像这样改写你的理解:
a = [1, 2]
b = [3, 4]
m = [a + [v] for v in b] # m is [[1,2,3],[1,2,4]]
答案 4 :(得分:1)
对于python列表,更改列表的方法在适当的位置工作并返回None
。这适用于extend
以及append
,remove
,insert
,...
在回答一个较旧的问题时,我勾勒出一个list
的子类,其行为符合预期list
的效果。
Why does [].append() not work in python?
这是教育性的。为了利弊..看看我的答案的评论。
我喜欢这种方法,因为它能够链接方法并以流畅的方式工作,例如:
之类的东西li = FluentList()
li.extend([1,4,6]).remove(4).append(7).insert(1,10).reverse().sort(key=lambda x:x%2)
是可能的。
答案 5 :(得分:0)
a.extend()
返回None
。
你可能想要其中一个:
>>> m = a + b
>>> m
[1, 2, 3, 4]
>>> a.extend(b)
>>> a
[1, 2, 3, 4]
除此之外,如果你想迭代列表中的所有元素,你就可以这样做:
m = [somefunction(element) for element in somelist]
或
for element in somelist:
do_some_thing(element)
在大多数情况下,无需查看指数。
如果你只想在列表中添加一个元素,你应该使用somelist.append(element)
而不是`somelist.extend([element])