Python中打印变量如何输出绑定的原变量名而非对应值
Python打印变量上一级绑定变量名的实现方法
Python中常规的变量赋值逻辑是将变量指向目标内存对象,对象本身不会存储指向它的变量名信息,也不会记录变量之间的赋值链路,因此默认无法直接实现你要的效果,需要通过额外手段达成。
方案1:自定义封装类(推荐,稳定可控)
通过自定义类包裹实际值,手动记录赋值时的上一级变量名,可控性高,不会受作用域、同值变量干扰。
实现代码如下:
class ValueWrapper: def __init__(self, value, prev_var_name=None): self.value = value self.prev_var_name = prev_var_name # 控制直接打印对象时的输出内容 def __str__(self): return self.prev_var_name if self.prev_var_name is not None else str(self.value) # 使用示例 Variable1 = ValueWrapper(1) Variable2 = ValueWrapper(Variable1.value, prev_var_name="Variable1") Variable3 = ValueWrapper(Variable2.value, prev_var_name="Variable2") print(Variable3) # 输出 Variable2 # 需要获取实际值时取value属性即可 print(Variable3.value) # 输出 1
方案2:inspect模块动态扫描(不推荐,仅适用于极简单场景)
可以通过inspect模块获取当前作用域的所有变量,反向匹配和当前变量指向同一个对象的其他变量名,但该方案稳定性极差:只要作用域内存在多个变量指向同一个值,就会出现匹配错误,无法区分赋值链路。
实现代码如下:
import inspect def get_last_bind_varname(var): # 获取调用层的栈帧 call_frame = inspect.currentframe().f_back local_vars = call_frame.f_locals # 先匹配当前变量的变量名 current_varname = [k for k, v in local_vars.items() if v is var][0] # 匹配所有指向同一对象、且不等于当前变量名的结果,取第一个 match_list = [k for k, v in local_vars.items() if v is var and k != current_varname] return match_list[0] if match_list else str(var) # 使用示例 Variable1 = 1 Variable2 = Variable1 Variable3 = Variable2 print(get_last_bind_varname(Variable3)) # 简单场景下输出 Variable2
内容的提问来源于stack exchange,提问作者Jacob Boughton
相关产品推荐
相关产品推荐

