关于检查对象是否是Python中的迭代器的一个示例的混淆

关于检查对象是否是Python中的迭代器的一个示例的混淆,python,iterator,iterable,Python,Iterator,Iterable,我读过一些关于stackoverflow的文章,内容是关于如何在Python中检查对象是否是迭代器,但它们似乎并没有解决我的问题。我从《有效Python》一书中得到了这个例子 使用: visits = [15, 35, 80] normalize_defensive(visits) # No error visits = ReadVisits(path) # ReadVisits is a class with an __iter__ method. normalize_defensive(

我读过一些关于stackoverflow的文章,内容是关于如何在Python中检查对象是否是迭代器,但它们似乎并没有解决我的问题。我从《有效Python》一书中得到了这个例子

使用:

visits = [15, 35, 80]
normalize_defensive(visits)  # No error
visits = ReadVisits(path)  # ReadVisits is a class with an __iter__ method.
normalize_defensive(visits)  # No error
it = iter(visits)
normalize_defensive(it)
>>>
TypeError: Must supply a container
所以我的问题是:

if iter(numbers) is iter(numbers):  # An iterator — bad!
为什么此行要检查变量数是否是迭代器?当访问量=[15,35,80]时,如果
iter(numbers)是iter(numbers)
,那么当调用iterable时,对这样一个对象调用
iter()
将始终生成一个新的迭代器对象。但是在迭代器上调用
iter()
将始终返回相同的对象;这是一个要求,他们这样做

从:

返回迭代器对象本身。这需要允许容器和迭代器与
for
in
语句一起使用

由于
iter(iterable)
总是返回自身,因此测试
iter(obj)为iter(obj)
将为真;在这两种情况下都返回相同的对象。

当您调用一个iterable时,对这样的对象调用
iter()
将始终生成一个新的迭代器对象。但是在迭代器上调用
iter()
将始终返回相同的对象;这是一个要求,他们这样做

从:

返回迭代器对象本身。这需要允许容器和迭代器与
for
in
语句一起使用


由于
iter(iterable)
总是返回自身,因此测试
iter(obj)为iter(obj)
将为真;两种情况下都返回相同的对象。

要帮助您理解Martijn的解释,请查看以下内容:

>>> numbers = [15, 35, 80]
>>> it  = iter(numbers)
>>> it2 = iter(numbers)
>>> it3 = iter(it)
>>> id(it1)
51123792
>>> id(it2)
51056464    # id of it2 is different from it1
>>> id(it3) 
51123792    # iterator of iterator it3 has the same id as iterator it1

因此,如果
numbers
是一个
iterator
,在
numbers
上调用
iter
将始终返回内部相同的对象:
iter(numbers)是iter(numbers)
将是
True
为了帮助您理解Martijn的解释,请查看以下内容:

>>> numbers = [15, 35, 80]
>>> it  = iter(numbers)
>>> it2 = iter(numbers)
>>> it3 = iter(it)
>>> id(it1)
51123792
>>> id(it2)
51056464    # id of it2 is different from it1
>>> id(it3) 
51123792    # iterator of iterator it3 has the same id as iterator it1
因此,如果
numbers
是一个
iterator
,在
numbers
上调用
iter
将始终返回内部相同的对象:
iter(numbers)是iter(numbers)
将是
True