当我通过在迭代器上调用list函数来创建列表时,该迭代器本身是由itertools.combinations函数生成的,有时我会收到如下错误:
*** Error in argument: '(combinations(aDict,2))'
但是,如果我在print、len或isinstance函数中调用相同的列表,它会按预期工作。
我最初在脚本中得到了这种行为,但我可以最可靠地使用 pdb 重现它,因此代码示例涉及在 sript 上调用set_trace,然后在解释器上键入:
from itertools import combinations
aDict={'a':1,'b':2,'c':3}
print(len(list(combinations(aDict,2))))
print(isinstance(list(combinations(aDict,2)),list))
print(list(combinations(aDict,2)))
len(list(combinations(aDict,2)))
isinstance(list(combinations(aDict,2)),list)
list(combinations(aDict,2))
print('Hello')
import pdb
pdb.set_trace()
然后在解释器中输入这些命令:
>>> ================================ RESTART ================================
>>>
3
True
[('a', 'b'), ('a', 'c'), ('b', 'c')]
Hello
--Return--
> c:\sw_dev\00_draft_development\02_scade\a429test\test_value_generator\pdbcomb.py(15)<module>()->None
-> pdb.set_trace()
(Pdb) len(list(combinations(aDict,2)))
3
(Pdb) isinstance(list(combinations(aDict,2)),list)
True
(Pdb) list(combinations(aDict,2))
*** Error in argument: '(combinations(aDict,2))'
(Pdb) len(list(combinations(aDict,2)))
3
(Pdb)
所以我的问题是,是什么导致了错误,如果我将相同的命令包装为len的参数,为什么它不会发生?
(我在 64 位 Intel 机器上通过 Windows 7 运行 python 3.3.1)