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
相关产品推荐
相关产品推荐

