求助:如何实现可修改全局变量余额的地址转账函数?
解决转账函数修改全局余额的问题
原代码的核心问题
- 全局变量声明错误:
global关键字应该在函数内部使用,用来声明要操作的是全局变量,而非在全局作用域中提前标注。 - 参数传递是值副本:你传入的
from_addr和to_addr是全局变量的数值副本,函数内部修改的只是局部变量,不会影响全局的余额变量。
方案一:用字典存储地址余额(推荐)
用字典统一管理所有地址与余额的映射,传递地址的键名就能直接修改对应余额,灵活且易扩展:
# 字典存储所有地址的余额 addresses = { "addr_1": 1000, "addr_2": 200, "addr_3": 0 } def tx(from_addr_key, to_addr_key, tx_input): # 检查地址是否存在 if from_addr_key not in addresses or to_addr_key not in addresses: print("TRANSACTION ERROR: Address does not exist") return # 检查余额是否足够 if addresses[from_addr_key] < tx_input: print("TRANSACTION ERROR: Balance too low") return # 执行转账操作 addresses[from_addr_key] -= tx_input addresses[to_addr_key] += tx_input # 返回转账结果 return f"From Address: {from_addr_key} ({addresses[from_addr_key]}), To Address: {to_addr_key} ({addresses[to_addr_key]})" # 测试示例 tx("addr_1", "addr_3", 300) print(addresses["addr_1"]) # 输出700 print(addresses["addr_3"]) # 输出300
方案二:直接操作全局变量(不推荐,扩展性差)
如果必须使用单独的全局变量,可以通过globals()函数根据变量名直接修改全局变量:
addr_1 = 1000 addr_2 = 200 addr_3 = 0 def tx(from_addr_name, to_addr_name, tx_input): # 获取全局变量字典 global_vars = globals() # 检查变量是否存在 if from_addr_name not in global_vars or to_addr_name not in global_vars: print("TRANSACTION ERROR: Address variable does not exist") return # 检查余额是否足够 if global_vars[from_addr_name] < tx_input: print("TRANSACTION ERROR: Balance too low") return # 修改全局变量值 global_vars[from_addr_name] -= tx_input global_vars[to_addr_name] += tx_input # 返回转账结果 return f"From Address: {from_addr_name} ({global_vars[from_addr_name]}), To Address: {to_addr_name} ({global_vars[to_addr_name]})" # 测试示例 tx("addr_1", "addr_2", 200) print(addr_1) # 输出800 print(addr_2) # 输出400
方案对比
方案一通过字典统一管理地址,新增地址只需在字典中添加键值对,无需修改函数逻辑,代码耦合度低;方案二依赖全局变量名,后续维护和扩展容易出错,仅适合简单场景。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

