为什么"_"并不总是在交互式shell中给我最后的结果

Chr*_*sso 9 python python-3.x

通常我_用来访问Python交互式shell中的最后一个结果.特别是为了快速将变量分配给结果,我认为以后可能会很重要.

我最近发现的是,如果我_在for循环中使用as作为一个值,我不能再用它_来引用最后的结果了.

例:

>>> for _ in range(10):
...   pass
...
>>> 120
120
>>> a=_
>>> a
9
>>> _
9
>>> del _ # Now I can use _ to reference the last result again
>>> 120
120
>>> a=_
>>> a
120
Run Code Online (Sandbox Code Playgroud)

如果我使用空白for循环,那么_在我删除它之前不能被认为是最后的结果,然后它可以工作.

如果我列出理解虽然它似乎仍然工作正常:

>>> [1 for _ in range(10)]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
>>> 120
120
>>> a=_
>>> a
120    
Run Code Online (Sandbox Code Playgroud)

所以我猜我的问题是为什么?为什么会这样?为什么它_有时会被改变,以至于它不代表最后的结果?

mao*_*r10 8

原因很简单 - 尝试做

[i for i in range(1000)]
Run Code Online (Sandbox Code Playgroud)

然后访问i-你会看到我没有被定义(它的范围在列表理解范围内 - 当你退出列表理解时,那里"没有我").

这与for循环形成对比,在for循环中,i的范围不在实际的for循环中 - 因此您可以从外部访问它.

因此,如果我们转到你的情况(使用_),如果_被定义,就像使用常规for循环一样,那么你需要del它.如果你在列表理解中这样做,一旦列表理解结束,就不再定义下划线 - 这意味着它只是最后一个值