python文档经常提到“容器”。 E.g.:
如果check_circular为False(默认值:True),则为圆形 将跳过容器类型的参考检查和循环 引用将导致OverflowError(或更糟)。
但是我找不到容器的任何官方定义,也没有找到它们的列表。
对于Python 2.7.3:
已检查的内置类型是容器:
(isinstance(object, collections.Container)
返回True
)
定义了__contains__
方法的容器:
未定义__contains__
方法的容器:
检查不是容器的内置类型:
(isinstance(object, collections.Container)
返回False
):
告诉我您为isinstance(object, collections.Container)
检查了哪些其他内置类型,然后我会将它们添加到列表中。
答案 0 :(得分:76)
容器是包含任意数量的其他对象的任何对象。通常,容器提供了一种访问包含对象并迭代它们的方法。
容器示例包括tuple
,list
,set
,dict
;这些是内置容器。 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对象,如list
或dict
。 Container
类型是ABC,它的行为类似于接口。 Container是一个实现__contains__
方法的类。
以下是doc