繁体   English   中英

为什么Python的内置集合类型的变异方法没有返回任何内容而不是集合本身?

[英]Why do mutating methods for Python's built-in collection types return nothing instead of the collection itself?

能够将链接用于集合操作并能够将集合修改表达式嵌入到其他语句中然后使用修改后的集合可以非常方便和简洁,我发现自己经常因为每个需要单独的语句行而烦恼我想在python中修改一个集合,然后立即再次使用该集合。

示例包括: list.appendlist.extenddict.update

是否有一个特定的原因(哲学或其他原因)为什么python的内置方法上的变异方法没有返回(None)而不是集合本身? 我意识到我可以扩展内置插件以增加可链接性,但我想知道为什么原始设计不支持这一点。

避免混淆返回值是否为副本。

据我所知,没有Python内置修改它的参数并返回参数本身(像dict.popdict.setdefault这样的东西会返回一些东西,但它不是变异的dict ),所以如果你收到一个非None返回,你知道它是一个新对象,而不是你调用它的对象。 同样,如果您收到None的东西,明确变异的回报,它必须变异的说法。 这与命令查询分离的概念密切相关; 你要么某件事,或者返回新的东西,你不要两者同时进行。

其他语言的惯例可能更容易混淆; 如果你看到listb = lista.sort()你希望.sort()返回一个新的list ,因为否则, listb只是lista的别名,而单独的名称除了引起混淆之外什么也不做。 但它可能不会(毕竟,排序到一个新list通常比就地排序更昂贵,所以在纯功能语言之外,你需要默认排序到位),你被反复检查卡住了要验证的文档。

Python的方法非常简单:

  1. 可变类型具有在适当位置变异并且不返回任何内容的方法( None
  2. 不可变类型具有生成和返回原始值的修改副本的方法

大多数第三方软件包都遵循这种方法,使其更容易学习它们作为副作用; 如果他们遵循Python的约定,那么他们的行为是可预测的。

Python偏爱这种方法的另一个原因是因为Guido van Rossum认为它鼓励更易读的代码 ; val = mylist.append(foo).extend(bar).sort().reverse().pop()是不必要的难以阅读,允许它的语言,无论多么沮丧,往往会得到大量代码使用这种方法。 Python的一般方法是鼓励一种,而且只有一种明显的方法来做某事,并使这种方法可读/可维护。

暂无
暂无

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

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