3

当我通过在迭代器上调用list函数来创建列表时,该迭代器本身是由itertools.combinations函数生成的,有时我会收到如下错误:

*** Error in argument: '(combinations(aDict,2))'

但是,如果我在printlenisinstance函数中调用相同的列表,它会按预期工作。

我最初在脚本中得到了这种行为,但我可以最可靠地使用 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)

4

1 回答 1

3

list是一个 pdb 命令:

(Pdb) help list
l(ist) [first [,last]]
List source code for the current file.
Without arguments, list 11 lines around the current line
or continue the previous listing.
With one argument, list 11 lines starting at that line.
With two arguments, list the given range;
if the second argument is less than the first, it is a count.

使用感叹号将该行计算为 Python 表达式:(Pdb) !list(combinations('abc', 2))

于 2013-05-07T17:02:21.983 回答