Python中使用switch/case结构实现变量赋值的问题
Python中根据参数为指定变量赋值的可行方案
你遇到的问题确实很典型——Python没有原生switch/case结构,直接用字典存变量的话,因为整数、字符串这类不可变类型是值传递,字典里存的只是原变量的副本,修改副本根本不会影响原变量。下面给你几个实用的替代方案:
方案一:用字典存赋值操作的函数
把针对a和b的赋值逻辑包装成函数,字典的key对应参数param,value是对应的赋值函数,调用函数就能直接修改原变量:
init_val = 0 final_val = 10 a, b = init_val, init_val param = 'a' # 换成'b'就能给b赋值 def set_a(): global a a = final_val def set_b(): global b b = final_val switcher = { 'a': set_a, 'b': set_b } # 执行对应操作,param不在字典里时默认啥也不做 switcher.get(param, lambda: None)() print(a, b) # param='a'时输出 10 0
要是不想用global(比如在函数内部操作),可以把a和b放进可变容器(比如字典)里,这样函数就能直接修改容器内的值:
init_val = 0 final_val = 10 vars_dict = {'a': init_val, 'b': init_val} param = 'b' switcher = { 'a': lambda: vars_dict.update({'a': final_val}), 'b': lambda: vars_dict.update({'b': final_val}) } switcher.get(param, lambda: None)() print(vars_dict['a'], vars_dict['b']) # 输出 0 10
方案二:用if-elif结构(简单直接)
如果param的可选值不多,其实最直观的就是用原生if-elif,可读性拉满,没必要硬套字典结构:
init_val = 0 final_val = 10 a, b = init_val, init_val param = 'a' if param == 'a': a = final_val elif param == 'b': b = final_val # 还能加else处理param不在预期范围内的情况 print(a, b)
方案三:利用类属性动态修改
把a和b作为类实例的属性,通过属性名动态赋值,这种方式扩展性很强,以后加新变量只要给类加属性就行:
class Vars: def __init__(self, init_val): self.a = init_val self.b = init_val init_val = 0 final_val = 10 my_vars = Vars(init_val) param = 'b' # 先检查属性是否存在,避免报错 if hasattr(my_vars, param): setattr(my_vars, param, final_val) print(my_vars.a, my_vars.b) # 输出 0 10
不推荐的方案:使用exec
虽然可以用exec直接执行赋值语句,但这种方式安全性和可读性都很差,除非特殊场景,不建议使用:
init_val = 0 final_val = 10 a, b = init_val, init_val param = 'a' exec(f"{param} = final_val") print(a, b)
内容的提问来源于stack exchange,提问作者nogjam
相关产品推荐
相关产品推荐

