gpt4 book ai didi

python - Python递归期间的变量范围错误

转载 作者:太空宇宙 更新时间:2023-11-04 09:16:55 25 4
gpt4 key购买 nike

以下代码在构建 HTML 输出字符串时递归地将字典列表处理成树。尝试从递归函数中访问 output 字符串变量时出现范围访问错误。但是,在同一范围内访问 nodes 列表对象没有问题 - 事实上,在我添加 output var 之前,该函数运行良好。这是怎么回事?

样本: http://ideone.com/Kg8ti

nodes = [ 
{ 'id':1, 'parent_id':None, 'name':'a' },
{ 'id':2, 'parent_id':None, 'name':'b' },
{ 'id':3, 'parent_id':2, 'name':'c' },
{ 'id':4, 'parent_id':2, 'name':'d' },
{ 'id':5, 'parent_id':4, 'name':'e' },
{ 'id':6, 'parent_id':None, 'name':'f' }
]

output = ''

def build_node(node):
output += '<li><a>'+node['name']+'</a>'
subnodes = [subnode for subnode in nodes if subnode['parent_id'] == node['id']]
if len(subnodes) > 0 :
output += '<ul>'
[build_node(subnode) for subnode in subnodes]
output += '</ul>'
output += '</li>'
return node

output += '<ul>'
node_tree = [build_node(node) for node in nodes if node['parent_id'] == None]
output += '</ul>'

import pprint
pprint.pprint(node_tree)

错误:

Traceback (most recent call last):
File "prog.py", line 23, in <module>
node_tree = [build_node(node) for node in nodes if node['parent_id'] == None]
File "prog.py", line 13, in build_node
output += '<li><a>'+node['name']+'</a>'
UnboundLocalError: local variable 'output' referenced before assignment

最佳答案

错误源于此:

output = ''
def add(s):
output = output + s

相当于output+=s。扩展形式中的两个 output 指的是不同的范围。赋值设置了一个局部变量,而右边的表达式引用了一个全局变量(因为尚未设置局部变量)。

Python 检测到此类冲突并抛出错误。

其他人建议使用 global 让 Python 知道 output 都引用全局范围,但由于您在这里连接字符串,因此使用了一个更好的习惯用法对于 Python 中的这个任务:

output_list = []
def add(s):
output_list.append(s)
# ...
output = ''.join(output_list)

这里您没有在函数中设置变量,因此不需要 global。所有调用的字符串都添加到列表中,最后使用 ''(空字符串)作为分隔符进行连接。这比使用 += 添加字符串要快得多,因为 Python 中的字符串是不可变的,因此每次添加两个字符串时,Python 都必须创建一个新字符串。这引入了大量内存复制。

关于python - Python递归期间的变量范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8202536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com