Python 3.6.1中context["a"]:2的异常语法行为求助
你碰到的其实是Python 3.6引入的类型注解语句
这个诡异的现象其实很好解释——你笔误把赋值符号=写成了:,刚好撞上了Python 3.6新增的类型注解语句语法,以下是拆解分析:
为什么不触发SyntaxError?
Python 3.6通过PEP 526引入了变量注解语法(比如x: int = 5),同时也允许单独写出表达式: 注解内容这样的语句。这种语法是合法的,专门用来给表达式添加类型提示,供静态类型检查工具(比如mypy)使用,所以解释器不会报错。为什么没触发KeyError?
这是最关键的点:这种注解语句不会对左侧的表达式进行求值!也就是说context["a"]这个代码根本没被执行,解释器只是识别了这个语法结构,不会尝试去访问字典里的键,自然不会抛出KeyError。为什么字典还是空的?
这个语句完全不会对字典做任何修改操作,它本质上是一个“注释级”的标记,运行时解释器会直接跳过它,所以context始终是你初始化的空字典。为什么
repr(context["a"]: 2)会报错?expr: annotation是一个完整的语句,不是表达式,而repr()需要接收一个表达式作为参数,把语句放在表达式的位置自然会触发语法错误——这和切片半毛钱关系都没有哦。
举个直观的对比例子:
# 正常赋值,会修改字典 context = {} context["a"] = 2 print(context) # 输出 {'a': 2} # 类型注解语句,无任何修改 context = {} context["a"]: 2 print(context) # 输出 {}
简单说,你写的代码相当于在字典里“标注了一下想要给键a关联的值是2”,但并没有真正执行赋值操作,所以完全不会改变字典的内容。
内容的提问来源于stack exchange,提问作者justengel
相关产品推荐
相关产品推荐

