Python map函数返回的列表在使用一次后消失

Python map函数返回的列表在使用一次后消失,python,string,list,python-3.x,dictionary,Python,String,List,Python 3.x,Dictionary,我是Python新手。我正在使用Python 3.3.2,我很难弄清楚为什么会出现以下代码: strList = ['1','2','3'] intList = map(int,strList) largest = max(intList) smallest = min(intList) 给我这个错误: Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError:

我是Python新手。我正在使用Python 3.3.2,我很难弄清楚为什么会出现以下代码:

strList = ['1','2','3']
intList = map(int,strList)
largest = max(intList)
smallest = min(intList)
给我这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: min() arg is an empty sequence
没有给我任何错误

我的想法是,当intList被分配给map函数的返回值时,它会变成迭代器,而不是列表,如所示。也许作为调用
max()
的一个副作用,迭代器被迭代到列表的末尾,导致Python认为列表是空的(我在这里借鉴C知识,我不熟悉迭代器在Python中的实际工作方式)。我必须支持的唯一证据是,对于第一个代码块:

>>> type(intList)
<class 'map'>
>>> type(intList)
<class 'list'>
>类型(intList)
而对于第二段代码:

>>> type(intList)
<class 'map'>
>>> type(intList)
<class 'list'>
>类型(intList)

有人能帮我确认或否认吗?

你完全正确。在Python3中,
map
返回一个迭代器,该迭代器只能迭代一次。如果您第二次迭代某个迭代器,它将立即引发
StopIteration
,就好像它是空的一样
max
消耗整个内容,
min
将迭代器视为空。如果需要多次使用元素,则需要调用
list
以获取列表而不是迭代器。

来自
映射
文档:

返回一个迭代器,该迭代器将函数应用于iterable的每个项,并生成结果

来自

一旦迭代器的next()方法引发StopIteration,它必须在后续调用中继续这样做

因此,无论底层数据对象是什么,迭代器只能使用一次。它建立在生成器的概念之上

itertools.tee
可用于从一个迭代器生成多个独立迭代器

l1,l2 = itertools.tee(intList,2)
max(l1)
min(l2)

如果tuple或set-on-map对象比listSo-python3和python2软件更适合您的目的,那么您也可以调用tuple或set-on-map对象?没有向后兼容性?我在尝试重用
gtk.TreeIter
@LuisA.Florit时也遇到了同样的错误:是的,这就是Python 3背后的想法。在这个版本中,他们打破了向后兼容性,改变了不打破向后兼容性就无法改变的东西。@LuisA.Florit:我认为你所做的也不会对Python2起作用-TreeIter听起来像是Python2上的迭代器-但是
gtk.TreeIter
文档是奇怪,所以我不确定在任何Python版本中应该如何使用TreeIter。@user2357112supportsMonica:它以前工作过。我甚至有一份ITER的清单,在我的程序中随处可见。它坏得很厉害,我不得不切换到
list
,并以“经典”的方式编制索引。