我认为如果我在python中执行以下代码
var = [0].extend(range(1,10))
然后var
将是一个值为0 - 9的列表。
是什么给出了?
答案 0 :(得分:10)
list.extend
是一种就地方法。它对对象本身执行操作并返回None
。
这样可行:
var = [0]
var.extend(range(1, 10))
更好的是:
var = list(range(10))
答案 1 :(得分:6)
extend()不返回任何内容(实际为None
),它会“就地”进行更改,即列表本身已被修改。
我想你是在追求这个:
>>> var = [0]
>>> var.extend(range(1, 10))
>>> var
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
答案 2 :(得分:4)
要使问题中的代码起作用,您需要执行以下操作:
>>> var = [0]
>>> var.extend(range(1,10))
>>> var
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
之前没有用,因为extend()返回None
,而且这是设计的:Python遵守Command/Query Separation。
答案 3 :(得分:3)
正如OscarLópez和其他人已经解释过的那样,extend是一个命令,它返回None,以遵守命令/查询分离。
他们都建议通过使用extend作为命令来修复此问题。但还有另一种选择:改为使用查询:
>>> var = [0] + range(1, 10)
了解这里的差异非常重要。 extend
修改了您的[0]
,将其转换为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
。但是+
运算符会单独留下[0]
,并返回一个新列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
。
如果您对列表有其他引用并想要更改它们,显然您需要extend
。
但是,如果您只是使用[0]作为值,使用+
不仅可以编写紧凑,流畅的代码(正如您尝试的那样),还可以避免改变值。这意味着如果您使用不可变值(如元组)而不是列表,则相同的代码可以工作,但更重要的是,它对于避免副作用的函数式编程风格至关重要。 (这种风格有很多原因很有用,但一个显而易见的原因是不可变对象和无副作用的函数本质上是线程安全的。)