为什么列表操作不返回结果列表?

时间:2012-06-26 10:21:52

标签: python

我对导致这种情绪的思维过程感兴趣。对我来说,一个相对新手,似乎阻碍了,因为它阻止了列表处理的“链接”(例如mylist.reverse().append('a string')[:someLimit])。我想可能是“那些人的力量”决定列表理解是一种更好的范式(一种有效的观点),所以不想鼓励其他方法 - 但是这似乎有悖常理,即使是更好的直观方法替代品存在。

请注意,我并没有抱怨(我确定 是一个明智的理由,我只是对它是什么感兴趣!),也没有寻找解决方案(评论{{ 3}}非常有启发性 - 只是寻找一些背景,并深入理解语言的设计过程。

3 个答案:

答案 0 :(得分:8)

Python中的一般设计原则是用于就地改变对象以返回None的函数。我不确定它会不会是我选择的设计选择,但它基本上是要强调不返回新对象...... GvR(我们的Python BDFL)在这里陈述了设计选择:http://mail.python.org/pipermail/python-dev/2003-October/038855.html

答案 1 :(得分:5)

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

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

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

所以l.reverse()什么都不返回(因为现在列表已被反转,但是同一个l仍然指向该列表),但是reversed(l)必须返回新生成的列表,因为{ {1}}仍然指向旧的,未经修改的列表。

编辑:我刚刚从another answer了解到这个原则被称为Command-Query separation

答案 2 :(得分:3)

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