双层循环获取列表中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
相关产品推荐
相关产品推荐

