Python全局变量未定义求助:列表追加触发NameError报错
为什么全局变量
hit会提示未定义? 这问题的核心有两个关键点,咱们拆开来理清楚:
1. hit的初始化依赖条件,可能根本没被创建
看你的hit_or_stand()函数:
def hit_or_stand(): global hit if hitStand == ("hit"): player_hand() card = deck() hit = [] hit.append(card)
只有当hitStand等于"hit"的时候,hit这个全局变量才会被初始化。如果hitStand不是"hit",那hit从头到尾都没被定义过,这时候调用player_hand()自然会报NameError。
而且你调用的顺序是先hit_or_stand()再player_hand(),但如果hitStand不满足条件,hit还是不存在。
2. player_hand()里没有明确声明要使用全局的hit(虽读取时Python会找全局,但前提是变量已存在)
就算hit已经被正确初始化了,player_hand()里如果要使用全局的hit,最好显式加上global hit声明——虽然Python在读取变量时会向上查找作用域,但显式声明能避免很多作用域混淆的问题,也让代码逻辑更清晰。
怎么修复?
方案一:确保hit始终被初始化,不管条件是否满足
修改hit_or_stand(),把hit的初始化放在条件外面,保证全局变量一定存在:
def hit_or_stand(): global hit hit = [] # 先初始化全局变量,避免未定义 if hitStand == "hit": card = deck() hit.append(card)
这里还去掉了条件里多余的括号,hitStand == "hit"就足够清晰了。
方案二:在player_hand()里声明global hit
def player_hand(): global pHand, hit # 加上hit的全局声明 # ... 你的其他代码 ... pHand.append(hit)
更优建议:少用全局变量,改用参数传递
全局变量很容易导致作用域混乱,尤其是多个函数依赖的时候。你可以把hit作为参数传给player_hand(),这样代码逻辑更清晰,也从根源上避免全局变量的问题:
def hit_or_stand(): hit = [] if hitStand == "hit": card = deck() hit.append(card) player_hand(hit) # 把hit作为参数传过去 def player_hand(hit): pHand = [] # 注意这里要把deck()的返回值赋值给card,否则card也会未定义 card = deck() pHand.append(card) card = deck() pHand.append(card) pHand.append(hit) pHand = " and ".join(pHand) return pHand hit_or_stand()
另外还要注意,你的player_hand()里多次调用deck()但没把返回值赋值给card,直接pHand.append(card)会导致card也未定义,这个问题也要一起解决哦。
内容的提问来源于stack exchange,提问作者SMITHIN COMEDY
相关产品推荐
相关产品推荐

