请解释一下这个python行为

时间:2010-04-01 03:00:54

标签: python initialization

class SomeClass(object):
    def __init__(self, key_text_pairs = None):
        .....
        for key, text in key_text_pairs:
            ......
            ......

x = SomeClass([(1, "abc",), (2, "fff",)])

即使我按照上面的语句传递列表, init 中key_text_pairs的值也为None。为什么会这样?

我想编写一个通用的 init ,它可以获取所有迭代器对象......

由于

编辑:oops ..我想以元组的形式传递键值对...我只是想创建一个玩具示例..我仍然看到相同的行为

3 个答案:

答案 0 :(得分:2)

首先,当你说for key, text in key_text_pairs时,你暗示列表中有元组。我完全按照它的方式测试了你的代码,这就是发生的事情。

x = SomeClass([1, 2, 3])更改为x = SomeClass([(1, 1.0), (2, 2.0), (3, 3.0)])并查看是否有帮助

干杯

答案 1 :(得分:0)

所以只看那段代码,你发布的是你想要的东西吗?具体来说,如果您传入的列表如下:

[1, 2, 3]

然后我认为你不想尝试像这样提取它:

for key, text in key_text_pairs

您可以将单个整数列表提取为一对值,如键/文本。

如果我在发布时运行该代码,我会得到一个堆栈跟踪:

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    x = SomeClass([1, 2, 3])
  File "test.py", line 3, in __init__
    for key, text in key_text_pairs:
TypeError: 'int' object is not iterable

你需要做这样的事情(一次提取一个值):

class SomeClass(object):
    def __init__(self, key_text_pairs = None):
        for key in key_text_pairs:
            ....

x = SomeClass([1, 2, 3])

或者,如果要保持代码相同,原始列表需要更改为持有值对:

x = SomeClass([('a',1),('b',2),('c',3)])

答案 2 :(得分:0)

你可以发布追溯吗?

这是我运行代码时得到的结果:

In [1]: class SomeClass(object):
   ...:     def __init__(self, key_text_pairs = None):
   ...:         for key, text in key_text_pairs:
   ...:             print "key:", key, "text", text
   ...:             
   ...:             

In [2]: x = SomeClass([1,2,3])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/ryan/<ipython console> in <module>()

/home/ryan/<ipython console> in __init__(self, key_text_pairs)

TypeError: 'int' object is not iterable

In [3]: x = SomeClass(zip('abc', [1,2,3]))
key: a text 1
key: b text 2
key: c text 3