【问题标题】:List assignment/creation in Python showing unexpected behaviourPython 中的列表分配/创建显示意外行为
【发布时间】:2020-05-29 22:14:19
【问题描述】:

我正在玩一段代码,在此期间我偶然发现了 Python 的一些意外行为。

我定义了一个列表如下:

a = [1, 2, 3]

用循环制作另一个列表:

res = (item for item in a if a.count(item) > 0)
print(list(res)) # [1, 2, 3] -- as expected -- Consider this is line 1

后来我改变了第一个列表的初始值:

a = [7, 2, 9]

我预计 res 不会发生变化,因为我对 a 所做的更改是在创建 res 之后发生的,但令我惊讶的是, res 的值发生了变化。

print(list(res)) # prints [] -- Consider this as line 2

更令人震惊的是,print的结果取决于第1行的print语句,如果我在第1行注释掉print语句,那么第2行就会打印[2]

谁能解释一下这里发生了什么?

【问题讨论】:

  • 变量x 未在任何地方设置。
  • 谢谢,我已经编辑了。
  • 重新分配a 与此无关。如果你只是连续两次print(list(res)),你会看到同样的效果。
  • 认真考虑学习python的协议和生成器
  • 顺便说一句,(item for item in a if a.count(item) > 0) 是一种低效的算法,它是二次时间,你可以在线性时间内完成

标签: python arrays python-3.x list


【解决方案1】:

res = (item for item in a if a.count(x) > 0) 创建一个通过调用list(res) 耗尽的生成器。

当您调用下一个 list(res) 时,它会返回空列表 - []

考虑先创建一个列表,例如res = [item for item in a if a.count(x) > 0]。

【讨论】:

  • 嘿@andrej,如果你能阅读我的答案并发表评论,如果你认为它是对的或错的,你会非常感激。
  • @YudhishthirSingh 是的,你的答案是好的——生成器只能迭代一次。例如这里有更多关于它的信息:stackoverflow.com/questions/47789/…
【解决方案2】:

好的,我想我明白了,我没有用那个循环创建另一个列表,而是创建了一个叫做生成器的东西。

它只能转换为列表一次,这就是为什么如果我在第 1 行给出打印语句,它会打印 []。

它会根据a的值修改自己,直到用完为止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多