代码下方
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
尚未通过计算列表推导表达式进行评估,为什么在第一种情况下不会抛出错误?
答案 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()
的东西)。