67

python 文档经常提到“容器”。例如

如果 check_circular 为 False(默认值:True),则容器类型的循环引用检查将被跳过,循环引用将导致 OverflowError(或更糟)。

但我找不到任何官方的容器定义,也找不到它们的列表。

编辑

对于 Python 2.7.3:

检查的内置类型是容器:

isinstance(object, collections.Container)返回True

  1. __contains__定义了方法的容器:

    • 所有内置序列类型:列表、字节数组、字符串、Unicode 字符串和元组。
    • 字典
    • 所有内置集合类型:集合和frozensets
  2. 没有__contains__定义方法的容器:

    • xrange 对象

检查不是容器的内置类型:

isinstance(object, collections.Container)返回False):

  • 整数对象
  • 浮动对象
  • 长物体
  • 布尔对象
  • 模块对象
  • 文件对象
  • 缓冲区对象
  • 无对象

告诉我您检查了哪些其他内置类型isinstance(object, collections.Container) ,我会将它们添加到列表中。

4

3 回答 3

91

容器是包含任意数量的其他对象的任何对象。通常,容器提供了一种访问所包含对象并对其进行迭代的方法。

容器的例子包括tuple, list, set, dict; 这些是内置容器collections模块中提供了更多容器类型。

严格来说,collections.abc.Container抽象基类(collections.Container在 Python2 中)适用于任何in通过__contains__魔法方法支持运算符的类型;因此,如果您可以编写x in ytheny通常是一个容器,但并非总是如此:容器和一般可迭代对象之间的一个重要区别在于,当迭代时,容器将返回它们持有引用的现有对象,而生成器和例如file对象将创建每次一个新对象。这对垃圾收集和深度对象遍历(例如deepcopy和序列化)有影响。

举个例子,iter(lambda: random.choice(range(6)), 0)支持in算子,但肯定不是容器!

Collections.abc.Container抽象基类仅考虑__contains__魔术方法而不考虑支持运算符的其他方式的意图in是,真正的容器应该能够在单个操作中测试包含,而不会明显改变内部状态。由于Collections.abc.Container定义__contains__为抽象方法,因此可以保证 if isinstance(x, collections.abc.Container)thenx支持该in运算符。

那么在实践中,所有的容器都会有这个__contains__神奇的方法。然而,当测试一个对象是否是一个容器时,如果子类检查发生变化,你应该使用它isinstance(x, collections.abc.Container)来保持清晰和向前兼容。Container

于 2012-07-20T08:51:11.683 回答
10

根据http://docs.python.org/dev/library/collections.abc.html#module-collections.abc,容器的最一般定义只是一个实现__contains__. 一般来说,像“容器”或“序列”这样的 Python 概念不是抽象定义的;他们的行为是“鸭式”的。也就是说,容器是您可以在其上使用in运算符的东西。

Python 内置容器类型是 tuple、list、dict、set、frozenset 和 str 和 unicode(或 Python 3 中的 bytes 和 str),以及其他一些技术上属于类型但在特定上下文之外不常用的构造(例如,缓冲区对象和 xrange 对象)。collections模块中提供了其他容器类型。

于 2012-07-20T08:54:31.947 回答
0

容器都是包含其他对象(如listor )的 python 对象dictContainer类型是 ABC,它的行为类似于接口。Container 是实现该__contains__方法的类。

这是文档

于 2012-07-20T08:57:12.517 回答