You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python脚本中仅列出用户自行创建的变量?

只列出普通Python脚本中自行创建的变量

这问题我之前折腾过好一会儿!普通Python环境不像IPython那样会自动帮你区分用户自定义变量和系统/内置变量,直接用dir()globals()这些方法会把一大堆内置属性、模块导入项都混进来,得换个思路——记录脚本运行前的全局变量快照,再和运行后的对比,就能精准找出你自己创建的变量了。

具体实现步骤

  1. 在脚本最顶部记录初始全局变量
    这一步要放在所有用户代码(包括导入模块、定义变量的代码)之前,才能拿到最纯净的初始环境变量集合:

    # 脚本第一行就执行这个,记录初始全局变量
    initial_global_vars = set(globals().keys())
    
  2. 编写你的业务代码
    就是你创建那22个变量的部分,示例如下:

    # 示例:创建一些用户变量
    name = "Alice"
    age = 30
    scores = [90, 85, 95]
    # ... 其他19个自定义变量
    
  3. 对比快照,筛选用户变量
    用当前的全局变量减去初始快照,再过滤掉可能残留的下划线开头的系统变量(初始快照已包含大部分,但保险起见):

    # 获取当前全局变量集合
    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

火山引擎 最新活动