Python 基于访问权限的变量更改类型?

Python 基于访问权限的变量更改类型?,python,types,list-comprehension,Python,Types,List Comprehension,我有一个由节点和边组成的有向图结构,它们都是事件父类的子类。根据外部事件,边缘可以是活动的,也可以是非活动的。然后我找到从给定节点到根节点的所有有向路径,但我真正关心的是沿途的节点,而不是边。例如,要将一组边转换为一组节点,我使用: >>> paths [[<Edge F>, <Edge B>]] >>> lst = [set(map(lambda e: e.tail, path)) for path in paths] 为什么这两种

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

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

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

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

那么这个表达呢

[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
设置的。

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

那么这个表达呢

[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
设置的。

你不是以不同的方式访问同一事物,你是在访问不同的事物。你不是以不同的方式访问同一事物,你是在访问不同的事物。我永远不会发现这一点。非常感谢。有趣的是,
path
Edge
实例,因为这是该函数体中
path
的第一个定义。@CoconutBandit:实际上它可能是一个全局的。@CoconutBandit:尽管在演示会话中,
path
可以从路径中的
[set(map(lambda e:e.tail,path)]设置为路径中的路径]
expression,但只有在Python2中,列表理解没有自己的作用域。是的,这样就可以了。我正在使用Python2。我永远不会明白这一点。非常感谢。有趣的是,
path
Edge
实例,因为这是该函数体中
path
的第一个定义。@CoconutBandit:实际上它可能是一个全局的。@CoconutBandit:尽管在演示会话中,
path
可以从路径中的
[set(map(lambda e:e.tail,path)]设置为路径中的路径]
expression,但只有在Python2中,列表理解没有自己的作用域。是的,这样就可以了。我正在使用Python 2。