【问题标题】:Python a, b = b, a +b蟒蛇 a, b = b, a + b
【发布时间】:2020-04-13 08:58:49
【问题描述】:

这是我的第一个问题,我开始学习 Python。 有没有区别:

a, b = b, a + b

a = b
b = a + b

当您在下面的示例中编写它时,它会显示不同的结果。

def fib(n):
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a + b
    print()
fib(1000)

def fib(n):
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a = b
        b = a + b
    print()
fib(1000)

【问题讨论】:

    标签: python


    【解决方案1】:

    a, b = b, a + b 中,右侧的表达式在赋值给左侧之前先进行计算。所以相当于:

    c = a + b
    a = b
    b = c
    

    在第二个示例中,a 的值在 b = a + b 运行时已经更改。因此,结果是不同的。

    【讨论】:

      【解决方案2】:

      行:

      a, b = b, a + b
      

      更接近:

      temp_a = a
      a = b
      b = temp_a + b
      

      其中b 使用a 值,然后a 被重新分配给b 的值。

      Python 首先计算右侧表达式并将结果存储在堆栈中,然后获取这两个值并将它们分配给ab。这意味着a + b 是在a 更改之前计算的

      请参阅How does swapping of members in the python tuples (a,b)=(b,a) work internally?,了解这一切在字节码级别如何运作。

      【讨论】:

        【解决方案3】:

        假设我们以 ab 开头,如下所示:

        a = 2
        b = 3
        

        所以,当你这样做时:

        a, b = b, a + b
        

        发生的情况是您创建元组(b, a + b)(3, 5),然后将其解压缩为ab,因此a 变为3b 变为5

        在你的第二个例子中:

        a = b
        # a is now 3
        b = a + b
        # b is 3 + 3, or 6.
        

        【讨论】:

          【解决方案4】:

          让我们去探索它。

          a, b = b, a + b

          这是一个元组赋值,意思是(a, b) = (b, a + b),就像(a, b) = (b, a)一样

          从一个简单的例子开始:

          a, b = 0, 1
          #equivalent to
          (a, b) = (0, 1)
          #implement as
          a = 0
          b = 1
          

          当谈到(a, b) = (b, a + b)
          EAFP,直接试试吧

          a, b = 0, 1
          a = b #a=b=1
          b = a + b #b=1+1
          #output
          In [87]: a
          Out[87]: 1
          In [88]: b
          Out[88]: 2
          

          然而,

          In [93]: a, b = b, a+b
          In [94]: a
          Out[94]: 3
          In [95]: b
          Out[95]: 5
          

          结果与第一次尝试不同。

          这是因为 Python 首先计算右手边的a+b
          所以它相当于:

          old_a = a
          old_b = b
          c = old_a + old_b
          a = old_b
          b = c
          

          综上,a, b = b, a+b的意思是,
          a交换得到b的old_value,
          b交换得到旧值a和旧值b之和,

          【讨论】:

            【解决方案5】:

            a, b = b, a + b 类似于a, b = 0, 1 同时为两个变量a, b 赋值。首先分配a = b,然后分配b = a + b

            【讨论】:

              【解决方案6】:

              希望你没有受到C语言的影响,赋值运算符=的优先级高于逗号运算符,。不要以为是(a), (b = b), (a + b)。这是一个元组赋值,意思是(a, b) = (b, a + b)

              【讨论】:

                【解决方案7】:

                a,b = b,a+b 和 a=b b=a+b 有区别
                让我们看看以下两个例子:

                eg1:

                a,b = 0,1
                while a<10:
                  print(a)
                  a,b = b,a+b
                
                #output:
                0
                1
                1
                2
                3
                5
                8
                

                eg2:

                a,b = 0,1
                while a<10:
                  print(a)
                  a=b
                  b=a+b
                #output:
                0
                1
                2
                4
                8
                

                这是因为解释器总是先计算等号右边的数字。只有在右侧完成所有计算后,计算结果才会分配给左侧的变量。

                【讨论】:

                  猜你喜欢
                  • 2021-11-28
                  • 1970-01-01
                  • 2014-03-29
                  • 2021-10-06
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-12-08
                  • 2017-04-06
                  相关资源
                  最近更新 更多