可迭代和可下标有什么区别?是否有任何对象仅属于这些对象类型之一?

Aas*_*jan 0 python types iterable object python-3.x

可下标对象和可迭代对象有什么区别?什么是可下标但不可迭代的对象,反之亦然?

Ps 可下标的是其中包含其他对象的对象,迭代器是可下标的,可以迭代。但我能想到的也仅此而已。

tri*_*cot 6

可下标对象和可迭代对象有什么区别?

  • 可下标的对象实现语法__getitem__的评估obj[key]

  • 可迭代对象实现__iter__并因此支持迭代。

哪些对象是可下标但不可迭代的

一个示例是re.match()返回不可迭代的可下标。

import re
m = re.match(r"\w+ (\w+)", "Isaac Newton, physicist")
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

print(m[1])  # "Newton"
Run Code Online (Sandbox Code Playgroud)

但这会产生一个异常:

for word in m:  # TypeError: 're.Match' object is not iterable
    print(word)
Run Code Online (Sandbox Code Playgroud)

反之亦然?

一个例子是 a set,它支持迭代但不支持订阅。所以你可以这样做:

for x in set([42]):
    print(x)  # 42
Run Code Online (Sandbox Code Playgroud)

...但这会产生错误:

set([42])[0]  # TypeError: 'set' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)