【问题标题】:Type of variable changes based on access?基于访问的变量类型变化?
【发布时间】:2016-09-21 23:02:03
【问题描述】:

我有一个由节点和边组成的有向图结构,它们都是 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'>]

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

【问题讨论】:

  • 您访问的不是同一个东西,而是访问不同的东西。

标签: python types list-comprehension


【解决方案1】:

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

所以表达

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

被执行为

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

所以n 取自您之前拥有的某个随机预分配的path 变量,而那个变量 包含Edge 实例。这些对象与您在其他表达式中循环的lst[0] 的内容没有任何关系

你可能想反过来做:

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

所以path 实际上是从lst 设置的你迭代它之前。

【讨论】:

  • 我永远不会明白这一点。谢谢你。有趣的是,pathEdge 实例,因为这是该函数体中 path 的第一个定义。
  • @CoconutBandit:实际上,它可能是一个全局
  • @CoconutBandit:虽然,在您的演示会话中,path 可以从 [set(map(lambda e: e.tail, path)) for path in paths] 表达式中设置,但仅在 Python 2 中列表推导没有自己的范围。
  • 是的,可以。我正在使用 Python 2。
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2014-02-09
相关资源
最近更新 更多