【问题标题】:Changing a collection.Counter during enumeration? [duplicate]在枚举期间更改 collection.Counter? [复制]
【发布时间】:2017-07-04 16:54:21
【问题描述】:
counter = Counter()
// fill data into counter
for a, b in counter.most_common():
    if (b > 1):
        counter[a] = np.log(b)
    else:
        counter[a] = -np.log((1 / (b+0.01)))

如我所见,根据我的试验,这是安全的。当我在枚举集合时更改集合,不会发生任何坏事。在其他语言中,在for 的每个循环中,都会评估counter.most_common() 的值。

这在 Python 中不也会发生吗?

【问题讨论】:

  • “在其他语言中,在 for 的每个循环中,都会评估 counter.most_common() 值”- 什么语言会这样做?我一个都不知道。在我所知道的每一种带有 for-each 循环的语言中,你循环的东西只会被评估一次。
  • 或者简而言之:不要将 for-each 与 C 风格的 for 循环混淆。我所知道的所有具有 for-each 循环的语言,都会在开始时评估一次迭代。与例如的区别Java 迭代器是 .most_common() 返回一个不引用原始计数器的新列表。
  • 您可能会想到循环遍历根据需要生成值的惰性对象的情况,或者您可能会误认为改变集合的效果是重新评估它,但 most_common 急切地创建一个独立于创建它的计数器的新列表。
  • 不允许在迭代期间修改set,但这也会引发RuntimeErrorRuntimeError: Set changed size during iteration。由于您的操作不会改变计数器的大小,也不会引发异常,因此我认为它是安全的。
  • most_common() 在调用时返回 n 个最常见元素的列表,即在 for 循环的开头一次。返回的值可能不再是当前最常见的值,因为您正在更改循环内的 Counter 对象。如果您愿意 edit 您的问题并解释您最终想要实现的目标,您可能会提出替代方案或解决方法。

标签: python collections enumeration


【解决方案1】:

不,它没有。一个更具说明性的例子:

def example():
    print("Ping")
    return [1,2,3,4]

for x in example():
    print(x)

输出:

Ping
1
2
3
4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多