我认为如果我在 python 中执行以下代码
var = [0].extend(range(1,10))
然后var
将是一个包含值 0 - 9 的列表。
是什么赋予了?
list.extend
是一种就地方法。它对对象本身执行操作并返回None
。
这会起作用:
var = [0]
var.extend(range(1, 10))
更好的是:
var = list(range(10))
extend()不返回任何东西(实际上None
),它“就地”进行更改,即列表本身被修改。
我想你是这样的:
>>> var = [0]
>>> var.extend(range(1, 10))
>>> var
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
要使问题中的代码正常工作,您需要执行以下操作:
>>> var = [0]
>>> var.extend(range(1,10))
>>> var
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
它以前不起作用,因为extend()返回None
,这是设计使然:Python 遵守Command/Query Separation。
正如 Oscar López 和其他人已经解释的那样,extend 是一个返回 None 的命令,以遵守命令/查询分离。
他们都建议按预期使用扩展作为命令来解决此问题。但是还有另一种选择:改用查询:
>>> 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] 作为值的情况下,使用+
不仅可以让您编写紧凑、流畅的代码(正如您所尝试的那样),它还可以避免改变值。这意味着如果您使用不可变值(如元组)而不是列表,则相同的代码可以工作,但更重要的是,它对于避免副作用的函数式编程风格至关重要。(这种风格有用的原因有很多,但一个明显的原因是不可变对象和无副作用的函数本质上是线程安全的。)