Python中不使用字典,如何将拼接字符串转为对应变量并获取其值
字符串形式变量名转实际变量引用的实现方法
报错核心原因
你拼接得到的Uptime_只是普通字符串,Python解释器不会自动把字符串内容识别为已定义的变量,自然无法直接参与数值比较。要拿到预定义UpX类变量存储的余票值,有两种可落地的实现方案:
方案1:通过内置作用域字典动态查找(兼容现有零散变量写法)
Python的内置函数globals()、locals()会以字典形式存储当前全局/局部作用域下所有已定义的变量,字典的键就是变量名称的字符串,值就是变量实际存储的内容。你只需要把拼接好的变量名字符串作为字典的键传入,就能拿到对应变量的实际值。
注意:拼接字符串时要和你预定义变量的实际命名规则完全对齐,比如你之前代码里拼的是大写
'UP',但实际预定义变量是Up1、Up9这种首字母大写其余小写的形式,大小写不匹配会直接触发KeyError报错。
核心代码片段:
# 假设你提前定义了对应的余票变量 Up9 = 120 Up1 = 85 Up3 = 0 Up5 = 67 # 拼接和预定义变量规则一致的变量名 target_remain_var = f"Up{Uptime}" # 从全局作用域字典取出对应变量的实际余票值 current_remain = globals()[target_remain_var]
额外建议:因为动态查找的方式没有前置校验,如果用户输入的编码对应的变量不存在,代码会直接崩溃,可以加一层异常捕获做容错。
方案2:字典映射(工程上更推荐)
完全不建议零散定义Up1、Up2这类分散的独立变量,直接用字典把时间编码和对应余票值做映射,既不需要做字符串到变量名的转换,也能彻底避免动态查找带来的安全问题和报错风险,逻辑可读性也更强。
核心实现代码:
# 直接把所有上行车次的余票存在字典中,键就是用户需要输入的时间编码 up_ticket_db = { 9: 120, # 9点出发车次的余票 1: 85, # 11点出发车次的余票 3: 0, # 3点出发车次的余票 5: 67 # 15点出发车次的余票 } # 直接通过用户输入的编码取余票值,不需要任何字符串拼接转换 current_remain = up_ticket_db[Uptime]
现有代码的其他逻辑修正
除了变量取值的问题,你原来的代码还有两处逻辑bug需要修正:
- 循环判断条件逻辑反了:你初始化
Tickets_to_buy = 0,原判断while Tickets_to_buy > 余票值永远不会成立,循环根本不会执行,应该调整为当用户输入的购票数大于剩余票数时,重新提示输入 input()传参错误:input()函数只接收一个字符串类型的提示参数,你把提示文本和余票值拆成两个参数传入会直接报错,需要把两个内容拼接成完整的提示字符串。
修正后的完整可运行代码(以字典映射方案为例):
# 预定义上下行车次的余票映射 up_ticket_db = { 9: 120, 1: 85, 3: 0, 5: 67 } down_ticket_db = { 0: 90, 2: 45, 4: 0, 6: 72 } Uptime = int(input('''Please enter the time of uptime from below: 9 for 09:00 1 for 11:00 3 for 03:00 5 for 15:00''')) Downtime = int(input('''Please enter the time of downtime from below: 0 for 10:00 2 for 12:00 4 for 14:00 6 for 16:00''')) # 直接取对应车次的剩余票数 up_remain = up_ticket_db[Uptime] down_remain = down_ticket_db[Downtime] Tickets_to_buy = 0 # 修正循环判断逻辑:当购票数超过余票时反复提示输入 while Tickets_to_buy > up_remain: Tickets_to_buy = int(input(f'Please enter number of tickets you would like to buy. It should be less than {up_remain}'))
内容的提问来源于stack exchange,提问作者user15228768
相关产品推荐
相关产品推荐

