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

pytest中使用全局变量触发NameError,为何代码无法运行?

NameError 报错原因解析

核心问题:作用域关键字用错了

你代码里的hits是test_retry函数的局部变量,不是模块级的全局变量。f()里写global hits,是让Python去寻找整个模块顶层的hits,而非外层test_retry函数里的那个hits——自然找不到,所以触发NameError。

这和pytest没有任何关系,完全是Python自身的作用域规则导致的:global关键字只能绑定模块级的全局变量,无法直接引用嵌套函数的局部变量。

为什么用列表能解决?

当你把hits改成hits = [0]时,你修改的是列表的内部元素,而不是重新赋值hits变量本身。列表是可变对象,Python可以从嵌套作用域找到这个列表对象,直接修改它的元素,不需要额外的作用域声明,因此不会报错。

另一种正确写法(不用列表)

如果想继续用整数类型的hits,把global换成nonlocal即可——这个关键字专门用来引用嵌套外层函数的局部变量:

def test_retry():
  hits = 0

  def f():
    nonlocal hits
    hits += 1
    1 / 0

  with pytest.raises(ZeroDivisionError):
    f()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:15:28