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

Ben*_*ey4 53 python containers

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):

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

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

eca*_*mur 81

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

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

严格地说,collections.abc.Container抽象基类(collections.Container在Python2中)适用于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更改子类检查.


Bre*_*arn 5

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

Python的内置容器类型的元组,列表,字典,集,frozenset和STR和unicode(或字节和STR在Python 3),以及几个其他构建体,其在技术上是类型,但通常不具体上下文中外部使用(例如,缓冲对象和xrange对象).collections模块中提供了其他容器类型.