繁体   English   中英

具有某些功能的设计原因就地修改 object

[英]Design reason behind having some functions modify the object in-place

random.shuffle修改列表而不是返回新列表的设计原因是什么?

例如,鉴于str.replace()返回一个新字符串,并且鉴于字符串是不可变的,不可能有任何其他方式,如果random.shuffle()返回一个新列表会不会更加一致?

当你有一个(大的)可变容器时,就地修改它可能比创建一个新容器更有效。 但是 is 不能作为tuplestr等不可变类型的选项。

大多数列表或数组混洗实现使用 Durstenfeld 的Fisher-Yates算法变体(在 Knuth 的计算机编程艺术,第 2 卷,第 3.4.2 节中也称为“算法 P”)。 该算法的优势在于它在O(n)时间内完成,并且需要O(1)额外的 memory(在现有列表需要开始的O(n)空间之上)。 这比在每个步骤中创建一个新列表要高效得多。 即使在纯函数环境中,库实现也可能会制作原始列表的初始副本,然后应用此(变异)算法。 这不会是纯粹的功能,而是完全隐藏在调用代码中。 此外,通过制作一次性副本,可以轻松地将实现从就地修改转换为更纯粹的功能样式。 然而,正如其他人所指出的,根据针对特定库观察到的其他原则,设计者可能会选择不这样做。

暂无
暂无

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

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