【问题标题】:Why does `for lst in lst:` work? [duplicate]为什么 `for lst in lst:` 有效? [复制]
【发布时间】:2015-09-09 07:17:59
【问题描述】:

以下代码

lst = ['foo', 'bar', 'baz']
for lst in lst:
    print lst

给我这个输出

foo
bar
baz

我预计会出现错误或以下输出:

['foo', 'bar', 'baz']
['foo', 'bar', 'baz']
['foo', 'bar', 'baz']

上面的代码是错误的,应该是

lst = ['foo', 'bar', 'baz']
for lst_element in lst:
    print lst_element

为什么python 虽然产生了预期的输出?

【问题讨论】:

  • 如果它已经产生了预期的输出,那有什么问题?
  • 为什么会出现错误? Python 是强类型但动态类型,它对你遮蔽lst 没有问题。
  • @ZdaR:没有错,但我想了解会发生什么。并且来自其他语言,令我惊讶的是这段代码可以工作,我想知道它为什么/如何工作。
  • @jonrsharpe:我原以为迭代会被第一个循环覆盖。所以我显然必须阅读和了解阴影。
  • @CoryKramer:你说得对,我的问题涉及相同的主题。但是我找不到问题(不知道我需要搜索同名的迭代器)-对不起!

标签: python python-2.7


【解决方案1】:

在 Python 中,当你说

for identifier in iterable:

首先将从 iterable 创建一个迭代器。因此,实际对象不会在循环中使用。然后迭代器将被迭代,当前值将绑定到名称​​标识符

引用official documentation of for

for_stmt ::=  "for" target_list "in" expression_list ":" suite
          ["else" ":" suite]

表达式列表被计算一次;它应该产生一个可迭代的对象。 expression_list 的结果创建一个迭代器。然后,该套件对迭代器提供的每个项目执行一次,按索引升序排列。 使用标准分配规则将每个项目依次分配到目标列表,然后执行套件。

在您的示例中,在最后一次迭代之后,lst 将引用baz,而不是列表本身,因为for 循环在最后一次迭代中已将名称lst 绑定到baz

【讨论】:

  • 你回答的最后一句话(在最后一次迭代之后,lst将指baz)是我理解的关键。非常感谢。
猜你喜欢
  • 2019-09-27
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
相关资源
最近更新 更多