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

双层循环获取列表中pandas DataFrame名称时返回迭代器名问题

问题根源

你实现的get_df_name反查逻辑存在上下文冲突:进入双层for循环后,全局作用域会生成df、df1两个迭代变量,二者与你预先定义的cat/dog/sunday/monday指向完全相同的DataFrame实例。函数遍历globals()匹配对象时,会优先命中这两个迭代器变量名,因此无法返回你预期的原始变量名。

最优解决方案

不需要做变量名反查,直接遍历目标变量名列表即可,逻辑更简单也不会出现匹配冲突,后续如果要操作对应DataFrame,直接从全局作用域取对象就行:

import pandas as pd

cat = pd.DataFrame()  
dog = pd.DataFrame()  
sunday = pd.DataFrame()  
monday = pd.DataFrame()  

for df_name in ["cat", "dog"]:
    for df1_name in ["sunday", "monday"]:
        # 需要操作DataFrame时用这两行取值即可
        df = globals()[df_name]
        df1 = globals()[df1_name]
        print("---------")
        print(f"{df_name} and {df1_name}")

运行后输出完全符合预期:

---------
cat and sunday
---------
cat and monday
---------
dog and sunday
---------
dog and monday
不推荐的兼容写法

如果你一定要保留反查变量名的函数逻辑,可以在匹配时过滤掉循环临时变量名,但这种方式鲁棒性极差——只要存在多个变量指向同一个DataFrame实例,就会返回错误的匹配结果,仅适合临时调试使用:

import pandas as pd

def get_df_name(df):
    # 排除循环用的临时变量名
    exclude_temp = {"df", "df1"}
    match_names = [x for x in globals() if globals()[x] is df and x not in exclude_temp]
    return match_names[0]

cat = pd.DataFrame()  
dog = pd.DataFrame()  
sunday = pd.DataFrame()  
monday = pd.DataFrame()  

for df in [cat, dog]:
    for df1 in [sunday, monday]:
            print('---------')
            print(get_df_name(df) + ' and ' + get_df_name(df1))

内容的提问来源于stack exchange,提问作者nerd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:24:15