繁体   English   中英

为什么var = [0] .extend(range(1,10))在python中不起作用?

[英]Why doesn't var = [0].extend(range(1,10)) work in python?

我想如果我在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遵循命令/查询分离

正如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]作为值,使用+不仅可以编写紧凑,流畅的代码(正如您尝试的那样),它还可以避免改变值。 这意味着如果您使用不可变值(如元组)而不是列表,则相同的代码可以工作,但更重要的是,它对于避免副作用的函数式编程风格至关重要。 (这种风格很有用的原因很多,但一个显而易见的原因是不可变对象和无副作用的函数本质上是线程安全的。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM