doctest文档有a section about execution context。 我的理解是,对于每个docstring中的测试,模块中的全局参数是浅拷贝的,但是在docstring内的测试之间不会重置。在
基于这一描述,我认为以下医生会通过:
X = 1
def f():
"""Function F.
>>> X
1
>>> f()
2
>>> X
2
"""
global X
X = 2
return X
def g():
"""Function G.
>>> g()
1
>>> X
1
"""
return X
但是下面的测试通过了!在
^{pr2}$似乎全局参数是跨docstring的测试共享的? 但只在函数调用中?在
为什么这是结果行为? 这是否与函数有一个独立于执行上下文的全局字典有关?在
不完全是。虽然全局变量确实是浅层复制的,但是您实际看到的是全局变量的作用域(使用关键字} 来观察这一点。在
global
)以及它在Python中在模块级别上的实际操作方式。您可以通过在赋值(X = 2
)之后的函数f
中放入一个^{是的,这个值确实是
^{pr2}$2
在f
的范围内,但是让我们看看它的全局变量。让我们看看它们在当前帧和上一帧中的比较。在啊哈,你可以看到它们实际上不是一回事,
X
确实是1
,而且没有改变,因为在doctest为此创建的<doctest doc.f>
模块中有全局变量。我们继续吧。在因此,您实际看到的是doctest中的全局变量与源代码中的全局变量不同(因此,}在这里的模块中是由
g
将返回2
,因为{f
更改的,但不是在doctest模块的浅拷贝范围中),尽管它最初是从模块复制的,但是更改是没有反映回底层模块,因为这是global
关键字的操作方式-在模块级别,而不是跨模块。在相关问题 更多 >
编程相关推荐