【问题标题】:Why does "_" not always give me the last result in interactive shell为什么“_”在交互式 shell 中并不总是给我最后的结果
【发布时间】:2018-07-31 04:07:45
【问题描述】:

通常我使用_ 来访问 Python 交互式 shell 中的最后一个结果。尤其是快速将变量分配给我认为以后可能很重要的结果。

我最近发现的是,如果我在 for 循环中使用 _ 作为值,我将无法再使用 _ 来引用最后的结果。

例子:

>>> 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

如果我使用空白的 for 循环,那么 _ 在我删除它之前不能被视为最后一个结果,然后它就可以工作了。

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

>>> [1 for _ in range(10)]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
>>> 120
120
>>> a=_
>>> a
120    

所以我想我的问题是为什么?为什么会这样?为什么_ 有时可以更改,而不是最后的结果?

【问题讨论】:

  • 列表推导不会泄漏python3中的控制变量。因此,您的 _ 不会泄漏到外部范围。但是,for 循环当然会泄漏变量

标签: python python-3.x


【解决方案1】:

原因很简单——试试做

[i for i in range(1000)]

然后访问 i- 你会看到 i 没有定义(它的范围在列表理解内——当你退出列表理解时,“没有 i”)。

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

因此,如果我们处理您的情况(使用 _),如果定义了 _,就像使用常规 for 循环一样,那么您需要 del 它。如果您在列表推导中执行此操作,则列表推导结束后,将不再定义下划线 - 这意味着它只是最后一个值

【讨论】:

  • 嗯,有道理。我在想无论_ 可以用来引用最后一个结果,并且会覆盖它之前分配给_ 的任何值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多