You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归中局部变量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:51:02