【问题标题】:For loop in python initializes an outer variable on each iterationpython中的for循环在每次迭代时初始化一个外部变量
【发布时间】:2013-02-28 04:55:00
【问题描述】:

我不明白为什么下面的代码会给出不同的结果:

from datetime import datetime

def foo():
    return {datetime.now() : True}

a = {}
a.update(foo())
a.update(foo())
a.update(foo())

还有:

a = {}
for i in xrange(3):
    a.update(foo())

前者a 以三个元素结束,而后者a 以一个元素结束(来自上一次迭代)。

【问题讨论】:

  • 我无法重现——也许我的电脑比你的慢 ;-)
  • 您确定datetime.now() 在两种情况下的所有调用中都返回不同的值吗?
  • 在我的机器上我得到三个
  • foo 中添加time.sleep(1),你会看到会发生什么。

标签: python for-loop dictionary


【解决方案1】:

只是你的运气。第二个代码可能在一毫秒(或微秒,取决于您的操作系统)内执行,并给出三个相同的日期时间,第一个不太可能这样做(在您的系统/您执行代码的方式上)。继续尝试,你可能会得到两个元素。不要写靠运气的代码。

【讨论】:

  • 轻微修正——只写取决于运气的代码如果你打算 :)。运气最终成为获得随机数的好方法 :-)——并不是说这将是获得随机数的好方法......
  • 通常运气比精心制作的 PRG 更糟糕 :)
  • 我实际上不确定某些应用程序是否如此。例如,请参阅Hardware random number generator
  • 因此“通常”而不是“总是”。
  • 我想我们在这里同意:-)。我只是想指出,运气可能在少数应用程序中有用。然而,绝大多数人不应该依赖运气(甚至是实施细节恕我直言)
【解决方案2】:

最终得到的元素数量取决于在datetime.now() 的粒度范围内对foo Python 的调用次数。

如果您在交互式控制台中运行它,那么在提示符处执行的语句之间,控制台将执行内务处理(例如,显示>>> 提示符),这将显着延迟下一条语句,而对于for loop 循环将在控制台执行任何操作之前完整执行。

【讨论】:

    猜你喜欢
    • 2012-12-02
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 2011-04-02
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多