递归中局部变量tmp未生效,print输出None的原因及解决方法
问题原因与解决方案
问题原因
Python采用对象引用传递,但你在函数内部对tmp赋值resource时,只是修改了函数内局部变量tmp的指向,不会影响外部的last_parent:
- 调用
get_pod_parent(pod, last_parent)时,tmp是last_parent(初始为None)的引用副本; - 进入else分支后,
tmp = resource仅让局部的tmp指向目标资源对象,外部的last_parent仍指向原来的None; - 同时函数没有返回值,外部
test变量也无法获取到资源,最终print(last_parent)输出None。
解决方案1:让函数返回最终资源
递归终止时直接返回目标资源,外部通过函数返回值接收结果,这是最直观的写法:
core = client.CoreV1Api() apps = client.AppsV1Api() def get_pod_parent(resource): if resource.metadata.owner_references: # 提取并转换资源类型为小写下划线格式 kind = re.sub(r'(?<!^)(?=[A-Z])', '_', resource.metadata.owner_references[0].kind).lower() parent = eval(f"apps.read_namespaced_{kind}")( resource.metadata.owner_references[0].name, resource.metadata.namespace ) # 递归调用并返回上层结果 return get_pod_parent(parent) else: # 递归终止,返回最顶层的父资源 return resource pod = core.read_namespaced_pod('test_name', 'test_namespace') last_parent = get_pod_parent(pod) print(last_parent)
解决方案2:使用可变对象承载结果
利用列表这类可变对象的特性,修改其内部元素时外部能感知到:
core = client.CoreV1Api() apps = client.AppsV1Api() def get_pod_parent(resource, result_list): if resource.metadata.owner_references: kind = re.sub(r'(?<!^)(?=[A-Z])', '_', resource.metadata.owner_references[0].kind).lower() parent = eval(f"apps.read_namespaced_{kind}")( resource.metadata.owner_references[0].name, resource.metadata.namespace ) get_pod_parent(parent, result_list) else: # 将目标资源添加到列表中 result_list.append(resource) pod = core.read_namespaced_pod('test_name', 'test_namespace') last_parent_list = [] get_pod_parent(pod, last_parent_list) # 从列表中取出目标资源 print(last_parent_list[0])
内容的提问来源于stack exchange,提问作者htodev
相关产品推荐
相关产品推荐

