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

scu*_*bbo 5 python

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

请注意,我不是在抱怨(我敢肯定有一个合理的理由,我在它是什么只是感兴趣!),也不是寻找一个解决方案(意见在这里非常具有启发性) -只是寻找一些情况下,并深入理解语言的设计过程.

Jon*_*nts 10

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

  • “当 pstat 很弱时,它就通过了我的过滤器。” 我喜欢它。[`pstats`](https://docs.python.org/3/library/profile.html#module-pstats) 至今仍然是逃脱的那个:`stats.strip_dirs().add()` => `<pstats.Stats 对象位于 0x0000018866977640>` (2认同)

Tim*_*ker 6

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

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

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

所以l.reverse()没有返回值(因为现在名单已经逆转,但identfier l仍指向该列表),但reversed(l)必须返回新生成的列表中,因为l仍指向旧的,未经修改的列表.

编辑:我刚刚从另一个答案中了解到这个原理叫做Command-Query分离.

  • 这显然是我需要培养的一种心态,因为我最初的反应是“……那为什么还要再退货呢?” 是“为什么不呢?”。在我看来,返回引用允许使用不同的技术(“链接”),而不会阻止任何其他技术(顺序修改),因此如果链接本身“不好”,它只会“更糟”。然而,其他评论中提出的论点(同样是由 Guido 本人提出的!)断言链接确实是不好的。谢谢您的意见!我真的很喜欢向那些知道自己在说什么的人学习! (2认同)
  • @scubbo:Python的Zen(`import this`)指出:“应该有一种-最好只有一种-显而易见的方法。” 这有助于回答“为什么不呢?” 一点点。尽管我必须承认Python中有多个区域“实现的方式不止一种”。似乎是指导原则:) (2认同)

归档时间:

查看次数:

320 次

最近记录:

13 年,3 月 前