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

2024-04-24 11:01:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

请注意,我不是在抱怨(我确信这是一个合理的理由,我只是对它是什么感兴趣!),也没有寻找解决方案(注释here非常有启发性)——只是寻找一些上下文,以及对语言设计过程的更深入理解。在


Tags: 方法列表string链接过程直观感兴趣reverse
3条回答

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

如果一个方法在原始对象上工作并对其进行了适当的修改,它不会返回任何内容,因为没有新的信息-显然已经有了对(现在已发生变化)对象的引用,那么为什么要再次返回它?在

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

因此l.reverse()不返回任何内容(因为现在列表已被反转,但是标识符l仍然指向该列表),但是{}必须返回新生成的列表,因为{}仍然指向旧的未修改的列表。在

编辑:我刚从another answer那里了解到这个原理叫做Command-Query separation。在

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

Python中的一般设计原则是将一个对象进行适当的变异以返回None的函数。我不确定这是否是我会选择的设计选择,但它基本上是强调一个新对象不会返回。。。GvR(我们的Python BDFL)在这里声明了设计选择:http://mail.python.org/pipermail/python-dev/2003-October/038855.html

相关问题 更多 >