Python 3.x 使用magic命令%%timeit-n1-r1会导致jupyter不保留局部变量的值

Python 3.x 使用magic命令%%timeit-n1-r1会导致jupyter不保留局部变量的值,python-3.x,jupyter-notebook,jupyter-lab,Python 3.x,Jupyter Notebook,Jupyter Lab,我刚注意到一件很奇怪的事。当我使用%%timeit-n1-r1magic命令来测量Jupyter lab中代码块的执行时间时,python不会在执行该块后保留局部变量的值! 例如,如果我运行包含以下代码的代码块: for i in range(10): for j in range(10): d = i - j 然后在另一个块中运行print(d),jupyter将显示上一次迭代中d的值。 但如果我运行这段代码: %%timeit -n1 -r1 for in in ran

我刚注意到一件很奇怪的事。当我使用
%%timeit-n1-r1
magic命令来测量Jupyter lab中代码块的执行时间时,python不会在执行该块后保留局部变量的值! 例如,如果我运行包含以下代码的代码块:

for i in range(10):
   for j in range(10):
       d = i - j
然后在另一个块中运行
print(d)
,jupyter将显示上一次迭代中d的值。 但如果我运行这段代码:

%%timeit -n1 -r1
for in in range(10):
   for j in range(10):
       d = i - j
然后运行
print(d)
,juoyter会向我显示一条错误消息:

NameError: name 'd' is not defined

这种奇怪行为背后的原因是什么

IPython/Jupyter获取单元格中的代码块,并在一个函数中运行它,该函数的作用域对于
\uuuu main\uuuu
模块的命名空间不可见。从这个角度来看,它似乎把细胞当作一根弦:

In [4]: get_ipython().magic('timeit 1 + 2')                                                                                                                                                                        
11.2 ns ± 0.167 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

In [5]: %%timeit 
   ...: 1 + 2 
   ...:  
   ...:                                                                                                                                                                                                            
11.1 ns ± 0.17 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
无论IPython函数运行什么,循环中的变量都是已知的,并且对循环进行计时,但是在
Timer
实例方法之外是不可访问的


当您在单元格(或普通Python交互式解释器)中运行范围(10)内的
for i循环(不含
%%timeit
)时,Python处理for循环的方式是在循环的每次迭代中动态地重新分配
i
j
d
值。在循环运行完之后,它们仍然会坐在
\uuuu main\uuuuuuu
(这是Python shell中的
\uuu name\uuuuuuuuu
dunder属性)的名称空间中。

对于in-in-range(10):
对于i-in-range(10):
?@Hoog,对不起,这是一个输入错误!我刚刚纠正了这一点,我不仅需要解释,还需要解决这个问题。