理解列表中的列表理解

时间:2018-06-15 18:42:23

标签: python list-comprehension

我在空列表上执行列表理解,我期待错误,但令我惊讶的是代码运行没有任何错误。

[]

输出为transaction

在列表理解期间,在调试器<undefined>中检查时似乎是transaction.sender。那么,当transaction未定义时,为什么不访问n = o1<<24 | o2<<16 | o3<<8 | o4 会抛出错误?

2 个答案:

答案 0 :(得分:2)

使用for循环考虑列表推导的等效扩展。

bs = []
for transaction in block['transactions']:
    bs.append(OrderedDict([('sender', transaction.sender)]))
print(bs)

输出仍然是[],因为for循环的主体永远不会被执行。

因此,Python不会因列表理解而崩溃,因为它永远不会尝试访问sender的{​​{1}}属性。

答案 1 :(得分:1)

您问“为什么当transaction显然不是对象时,不将attribute视为对象并访问其不存在的transaction投掷错误?”

答案是永远不会访问该属性。由于block['transactions']是一个空列表,并且理解在循环for transaction in block['transactions']上运行,因此永远不会执行循环,永远不会检查该对象,并且永远不会访问该属性。因此变量bs最终成为空列表。