使用Python eval为字典赋值时触发语法错误,请求技术帮助
Python eval赋值失败的解决办法
你的问题出在**eval()不能执行赋值语句**——它只能处理表达式(比如计算一个值的代码),而像Player0["Money"] = ...这种赋值属于语句,丢给eval就会报语法错误。
给你两种解决思路:
方法1:用exec代替eval
exec()函数可以执行任意Python语句,把你的eval换成exec就行:
Ship = ["1번 배","2번 배","3번 배","4번 배"] Player0 = {'Money':10,'Ship':0} Player1 = {'Money':10,'Ship':0} Player2 = {'Money':10,'Ship':0} Player3 = {'Money':10,'Ship':0} for i in range(4): SelectShip = int(input("베팅할 배의 번호를 입력하세요 : ")) BetMoney = int(input("베팅할 금액을 입력하세요 : ")) SelectShip += 1 exec('Player%d["Money"] = Player%d["Money"]-BetMoney'%(i,i)) exec('Player%d["Ship"] = SelectShip' %i)
注:你代码里的global声明完全没必要,因为是在全局作用域直接定义变量,循环里只是修改字典内容,不需要额外声明全局。
方法2:用列表存储玩家(更推荐,更安全简洁)
单独定义Player0到Player3太繁琐,而且字符串拼接变量名容易出错,不如把所有玩家放进一个列表,直接通过索引访问:
Ship = ["1번 배","2번 배","3번 배","4번 배"] # 生成4个初始状态一致的玩家字典 players = [{'Money':10, 'Ship':0} for _ in range(4)] for i in range(4): SelectShip = int(input("베팅할 배의 번호를 입력하세요 : ")) BetMoney = int(input("베팅할 금액을 입력하세요 : ")) SelectShip += 1 # 直接通过索引操作对应玩家,完全不用eval/exec players[i]['Money'] -= BetMoney players[i]['Ship'] = SelectShip
这种写法既避免了eval/exec的安全风险,代码可读性和维护性也更高,后续新增玩家只需调整列表长度即可。
内容的提问来源于stack exchange,提问作者lee seojin
相关产品推荐
相关产品推荐

