如何在Python脚本中仅列出用户自行创建的变量?
只列出普通Python脚本中自行创建的变量
这问题我之前折腾过好一会儿!普通Python环境不像IPython那样会自动帮你区分用户自定义变量和系统/内置变量,直接用dir()、globals()这些方法会把一大堆内置属性、模块导入项都混进来,得换个思路——记录脚本运行前的全局变量快照,再和运行后的对比,就能精准找出你自己创建的变量了。
具体实现步骤
在脚本最顶部记录初始全局变量
这一步要放在所有用户代码(包括导入模块、定义变量的代码)之前,才能拿到最纯净的初始环境变量集合:# 脚本第一行就执行这个,记录初始全局变量 initial_global_vars = set(globals().keys())编写你的业务代码
就是你创建那22个变量的部分,示例如下:# 示例:创建一些用户变量 name = "Alice" age = 30 scores = [90, 85, 95] # ... 其他19个自定义变量对比快照,筛选用户变量
用当前的全局变量减去初始快照,再过滤掉可能残留的下划线开头的系统变量(初始快照已包含大部分,但保险起见):# 获取当前全局变量集合 current_global_vars = set(globals().keys()) # 计算用户新增的变量:差集运算 + 过滤下划线开头的系统变量 user_created_vars = [var for var in current_global_vars - initial_global_vars if not var.startswith('_')] # 查看结果 print("你自行创建的变量:") for var in user_created_vars: print(f"- {var} (值: {globals()[var]})") print(f"总数:{len(user_created_vars)}")
补充优化:排除导入的模块
如果你不想把import进来的模块(比如import os后的os)算成“自行创建的变量”,可以再加一层类型过滤:
import types user_created_vars = [] for var in current_global_vars - initial_global_vars: if not var.startswith('_'): var_value = globals()[var] # 排除模块类型的变量 if not isinstance(var_value, types.ModuleType): user_created_vars.append(var)
为什么之前的方法不行?
dir()、globals().keys()这些方法返回的是当前环境下所有变量,包括Python内置的属性(比如__doc__、__package__)、标准库模块、甚至脚本运行时自动生成的属性,所以过滤下划线后还是会有大量非用户变量。而快照对比的方法,能精准捕捉到脚本运行后新增的变量,完全匹配你在IPython里%whos看到的结果。
内容的提问来源于stack exchange,提问作者SebMa




