15

我对导致这一点的思考过程感兴趣。对我来说,一个相对的新手,这似乎是一种阻碍,因为它阻止了列表处理的“链接”(例如mylist.reverse().append('a string')[:someLimit])。我想这可能是“The Powers That Be”决定列表理解是一个更好的范例(一个有效的意见),因此不想鼓励其他方法 - 但阻止直观的方法似乎是不正当的,即使更好存在替代方案。

请注意,我不是在抱怨(我确信有一个合理的理由,我只是对它是什么感兴趣!),也不是在寻找解决方案(这里的评论很有启发性)——只是在寻找一些背景,并对语言的设计过程有更深入的了解。

4

3 回答 3

23

Python 中的一般设计原则是用于将对象就地变异为 return 的函数None。我不确定这会是我选择的设计选择,但它基本上是为了强调不会返回新对象。

(GvR(我们的 Python BDFL)在这里说明了设计选择:http: //mail.python.org/pipermail/python-dev/2003-October/038855.html

于 2012-06-26T10:44:30.997 回答
11

我不能代表开发人员说话,但我发现这种行为非常直观。

如果一个方法对原始对象起作用并就地修改它,它不会返回任何东西,因为没有新信息——你显然已经有了对(现在已经变异的)对象的引用,那么为什么要再次返回它呢?

但是,如果一个方法或函数创建了一个新对象,那么它当然必须返回它。

所以l.reverse()什么都不返回(因为现在列表已被反转,但标识符l仍然指向该列表),但reversed(l)必须返回新生成的列表,因为l仍然指向旧的、未修改的列表。

编辑:我刚刚从另一个答案中了解到,这个原则称为Command-Query 分离

于 2012-06-26T10:40:04.930 回答
4

有人可能会争辩说,签名本身清楚地表明该函数会改变列表而不是返回一个新列表:如果该函数返回一个列表,其行为将不那么明显。

于 2012-06-26T10:39:03.150 回答