You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在函数内为全局变量添加类型注解的问题求助

解决SyntaxError: annotated name 'bank' can't be global问题

这个错误的核心原因是:Python语法不允许在函数内对global声明的变量直接使用带类型注解的赋值语句——bank: Bank = json.load(f)这种写法会被解释器判定为试图创建一个局部变量的类型注解,和你之前声明的global bank冲突。

下面是两种可行的解决方式:

方案一:全局提前定义并注解变量

在函数外部先初始化全局变量bank并添加类型注解,函数内直接赋值即可:

import json
from typing import Dict, Union

# 定义类型别名(Python 3.10+可用type,更早版本建议用TypeAlias)
type Bank = Dict[str, Dict[str, Union[int, float]]]
# 全局初始化并注解bank
bank: Bank = {}

def get_ball() -> None:
    """Reloads the bank dict from the bank.json file"""
    global bank
    with open("bank.json", "r") as f:
        bank = json.load(f)  # 直接赋值,无需重复注解
    print(bank)

get_ball()
print(bank)

方案二:使用typing.cast转换类型

如果不想提前初始化全局变量,可以用cast函数给json.load的返回值做类型标注,避免直接给全局变量加注解:

import json
from typing import cast, Dict, Union

type Bank = Dict[str, Dict[str, Union[int, float]]]

def get_ball() -> None:
    """Reloads the bank dict from the bank.json file"""
    global bank
    with open("bank.json", "r") as f:
        # 用cast指定返回值类型,赋值给全局变量
        bank = cast(Bank, json.load(f))
    print(bank)

get_ball()
print(bank)

补充说明

两种方案各有适用场景:

  • 方案一更适合需要全局变量在函数外也有明确类型约束的场景;
  • 方案二更灵活,不需要提前初始化全局变量,适合仅在函数内完成赋值的场景。

内容的提问来源于stack exchange,提问作者Patrovsky games

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:52:39