在分配错误之前了解参考

时间:2015-07-16 08:07:35

标签: python list-comprehension

代码下方

def is_leaf(tree):
    return type(tree) != list

def count_leaf(tree):
    if is_leaf(tree):
        return 1
    branch_counts = [count_leaf(b) for b in tree]
    return sum(branch_counts)
在表达式branch_counts中引用sum(branch_counts)时,

不会抛出此类错误。

但是在代码之下,

def is_leaf(tree):
    return type(tree) != list

def count_leaf(tree):
    if is_leaf(tree):
        return 1
    for b in tree:
        branch_counts = [count_leaf(b)]
    return sum(branch_counts)
在表达式branch_counts中引用sum(branch_counts)时,

会抛出此类错误。

在第一种情况下,branch_counts尚未通过计算列表推导表达式进行评估,为什么在第一种情况下不会抛出错误?

4 个答案:

答案 0 :(得分:2)

如果树为空[],则branch_counts变量未初始化。

要使代码等同于第一个代码,请对其进行修改:

def count_leaf(tree):
    if is_leaf(tree):
        return 1
    branch_counts = list()
    for b in tree:
        branch_counts.append(count_leaf(b))
    return sum(branch_counts)

答案 1 :(得分:0)

引起你的注意..第一个和第二个代码是不同的,如果你想让它做同样的工作,那么在第二个代码中将行更改为

branch_counts.append(count_leaf(b))

答案 2 :(得分:0)

由于s

中没有任何内容,因此在这种情况下不会打印任何内容
a=[]
for s in a:
   print "hi"

同样适用于"",{},()

这是第二种情况,如果tree为空,则不创建变量

即。)

a=[]

for s in a:
    c=s


print (c)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-96-2cd6ee2c70b0> in <module>()
----> 1 c

NameError: name 'c' is not defined 

对于第一种情况:

c=[s for s in a]
c
[]

程序中的错误是:

branch_counts = [count_leaf(b)]

始终只创建元素列表

必须在像branch_counts = []

这样的循环之前的某个位置启动它

然后在循环中:

branch_counts.append(count_leaf(b))

答案 3 :(得分:0)

在您的第一个示例中,因为您使用列表推导,branch_counts会使用空列表进行初始化:

>>> branch_counts = [count_leaf(b) for b in []]]
[]

在第二个示例中,for循环不会运行,因为b中没有tree。因此,branch_counts永远不会被分配任何内容。

>>> for b in []:
>>>     branch_counts = [count_leaf(b)]
>>> sum(branch_counts)
NameError: name 'branch_counts' is not defined

除此之外,正如其他人所指出的,在第二个例子中,每次循环运行时都会重新分配branch_count(而不是添加append()的东西)。