变量类型根据访问权限而变化?

时间:2016-09-21 14:56:45

标签: python types list-comprehension

我有一个由节点和边组成的有向图结构,它们都是Event父类的子类。根据外部事件,边可以是活动的或非活动的。然后我找到从给定节点到根节点的所有有向路径,但我真的只关心沿途的节点,而不是边缘。例如,要从一组边转换为一组节点,我使用:

>>> paths
[[<Edge F>, <Edge B>]]
>>> lst = [set(map(lambda e: e.tail, path)) for path in paths]

其中path是边列表。这让我感到困惑:当我去检查lst的内容时,它会根据我访问它的方式而改变

>>> lst
[set([<Node 2>, <Node 1>])]
>>> [type(n) for n in path for path in lst]
[<class 'libs.network.Edge'>, <class 'libs.network.Edge'>]
>>> [type(n) for n in lst[0]]
[<class 'libs.network.Node'>, <class 'libs.network.Node'>]

为什么这两种访问类型信息的方式不一样?

1 个答案:

答案 0 :(得分:3)

您的列表理解顺序错误。嵌套循环从从左到右列出

所以表达式

[type(n) for n in path for path in lst]

执行
for n in path:
    for path in lst:
        type(n)

所以n来自之前预先分配的path变量,而变量包含Edge个实例。那些对象 nothing 与您在其他表达式中循环的lst[0]内容有关。

你可能想要反过来这样做:

[type(n) for path in lst for n in path]

这样path实际上是从lst 设置的之前迭代它。