python中究竟是什么“容器”? (什么是python容器类型?)

时间:2012-07-20 08:45:12

标签: python containers

python文档经常提到“容器”。 E.g.

  

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

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

修改

对于Python 2.7.3:

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

isinstance(object, collections.Container)返回True

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

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

    • xrange objects
  3. 检查不是容器的内置类型:

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

    • 对象
    • 浮动物品
    • 长物
    • 布尔对象
    • 模块对象
    • 文件对象
    • 缓冲对象
    • 无对象

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

3 个答案:

答案 0 :(得分:76)

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

容器示例包括tuplelistsetdict;这些是内置容器collections模块中提供了更多容器类型。

严格地说,collections.abc.Container抽象基类(Python2中的collections.Container)适用于通过in魔术方法支持__contains__运算符的任何类型;所以如果你可以写x in y那么y 通常是一个容器,但并不总是:容器和一般 iterables 是迭代时,容器将返回它们持有引用的现有对象,而生成器和例如file个对象每次都会创建一个新对象。这对垃圾收集和深层对象遍历有影响(例如deepcopy和序列化)。

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

Collections.abc.Container抽象基类的意图只考虑__contains__魔术方法,而不是其他支持in运算符的方法是真正的容器应该能够测试在一次操作中遏制并且没有明显改变内部状态。由于Collections.abc.Container__contains__定义为抽象方法,因此保证如果isinstance(x, collections.abc.Container),则x支持in运算符。

在实践中,所有容器都将具有__contains__魔术方法。但是,在测试对象是否为容器时,为了清楚起见,应使用isinstance(x, collections.abc.Container),并且为了向前兼容性,Container子类检查是否应该更改。

答案 1 :(得分:5)

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

Python内置容器类型是元组,列表,字典,集合,冻结集和str和unicode(或Python 3中的字节和str),以及其他一些技术类型但不常用于外部的构造。特定上下文(例如,缓冲对象和xrange对象)。 collections模块中提供了其他容器类型。

答案 2 :(得分:0)

Container是包含其他对象的所有python对象,如listdictContainer类型是ABC,它的行为类似于接口。 Container是一个实现__contains__方法的类。

以下是doc