我在空列表上执行列表理解,我期待错误,但令我惊讶的是代码运行没有任何错误。
[]
输出为transaction
。
在列表理解期间,在调试器<undefined>
中检查时似乎是transaction.sender
。那么,当transaction
未定义时,为什么不访问n = o1<<24 | o2<<16 | o3<<8 | o4
会抛出错误?
答案 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
最终成为空列表。