【问题标题】:Python declaring multiple variable confusionPython声明多变量混淆
【发布时间】:2017-06-15 14:31:04
【问题描述】:

我想知道为什么这段代码给了我两种不同的解决方案:

a = 0
b = 1
solution = 0

while b <= 4000000:
    if b % 2 == 0:
        solution += b
    a, b = b, a + b

print(solution)

在这种情况下,solution 是 4613732。但是当我尝试这段代码时:

a = 0
b = 1
solution = 0

while b <= 4000000:
    if b % 2 == 0:
        solution += b
    a = b
    b = a + b

print(solution)

solution 是 4194302

有什么建议吗?

【问题讨论】:

  • a, b = b, a + b VS a = bb = a + b
  • 请记住,RHS 总是首先得到评估,您会发现这并不奇怪。
  • 使用打印语句调试和理解代码
  • 第一个是同时赋值,第二个是过程式,b 获取更新后的值。
  • @yosemite_k:请注意,分配不是同时分配的,因为它们是同时分配的,甚至没有一个人能够相互影响。作业是从左到右完成的。

标签: python variables fibonacci


【解决方案1】:

区别解释

因为你写:

a = b
b = a + b

在您的第二种方法中。这意味着在第一行之后,a 的值是 b。第二行将产生b = a + b = b + b 所以两次b。换句话说,第二个实际上会通过二的幂。

在第一种方法中不会发生这种情况,因为您写道:

a, b = b, a + b

因此,您首先构造一个元组(b,a+b)(使用ab 值)。 接下来您解压缩该元组再次放入ab。但是您首先使用旧值评估了a + b。这是本质的区别。

更有效的方法

你想总结 偶数斐波那契数。但是,您可以更有效地做到这一点。如果你对斐波那契数列进行分析,你会发现它是结构化的:

o o e o o e o o e ...

o奇数e偶数。因此,您可以简单地使用 三跳,例如:

a = 1
b = 2
solution = 0

while b <= 4000000:
    solution += b
    a,b = a+2*b,2*a+3*b

print(solution)

因此,我们在这里节省了迭代和检查b是否偶数:我们只知道它总是偶数。

当使用timeit(在linux上使用Python 3.5.3和GCC 6.3.0)时,我们得到如下结果:

original   3.4839362499988056
optimized  1.5940769709995948  45.755%

所以优化后程序的平均运行时间大约是原始程序的一半。

【讨论】:

    【解决方案2】:

    仅仅是因为,赋值运算符右侧的所有表达式都会首先被计算。

    假设您有以下代码:

    a = 5
    b = 7
    a, b = b, a + b 
    

    您希望a 被分配值7,然后b 被分配值14,ab 的总和使用a 的新值。

    实际上,在= 运算符的右侧,b 被评估为 7,a+b 被评估为 12

    a, b = 7, 12 
    

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 2010-11-24
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多