难以理解已将空列表返回给自身的函数的行为

时间:2014-12-05 07:06:21

标签: python list attributes iterator typeerror

我正在使用一些代码,这些代码使用了一个属性,这个代码是我用我的解释器演示下面的例子中最好的例子。我很难理解为什么代码按照他们的方式工作。

In [377]: def a():
   .....:     return []
   .....: 

首先,我定义了一个简单的函数,它返回一个空列表。

In [381]: a()
Out[381]: []

接下来,我迭代这个函数来尝试打印出来的东西:

In [397]: for i in a():
   .....:     print a.hello
   .....:     print a.hello()
   .....:     

In [398]: 

我没有得到任何输出。我注意到,当我返回for而不是tuple时,我在执行list循环时得到的完全相同:

In [399]: def a():
   .....:     return ()
   .....: 

在我看来,这与listtuples为空有关。然而,真正困惑的是当我在hello上调用a属性作为for循环的一部分时,我没有遇到任何错误。我不应该像TypeError那样告诉我对象a没有属性hellohello()或至少某些东西沿着这些线?这里发生了什么?

我感谢任何解释,如果我弄错了,请纠正我的误解。

谢谢。

1 个答案:

答案 0 :(得分:2)

for whatever in a():
  do_stuff_with_whatever(whatever)
如果do_stuff_with_whatever返回包含元素的迭代,则

仅执行a()。否则,第一次传递时whatever的值是多少?

换句话说,语句a.helloa.hello()永远不会有机会被执行,因为没有任何东西可以迭代。如果您将功能更改为:

def a():
    return [1]

然后您会看到AttributeError,因为a没有hello属性。