【问题标题】:Python variable assignment questionPython变量赋值问题
【发布时间】:2011-09-23 00:48:22
【问题描述】:
a,b = 0,1 
while b < 50:
    print(b)
    a = b
    b = a+b

输出:

1
2
4
8
16
32

其中:

a,b = 0,1 
while b < 50:
    print(b)
    a,b = b, a+b

输出(正确的斐波那契数列):

1
1
2
3
5
8
13
21
34

它们不一样吗?我的意思是a,b = b, a+ba = bb = a+b 基本相同——不是吗?

【问题讨论】:

    标签: python variable-assignment fibonacci


    【解决方案1】:

    两个赋值操作如何同时完成:

    a,b = b,a+b:首先在后台,我认为python将a+b分配给一个变量让我们称之为x并将b分配给一个变量让我们称之为y然后,分配xbya

    我认为“同时”的概念在逻辑上是不成立的,a在内存中的值必须先改变,然后b或反之亦然,所以a的值仍然取决于@987654333 @ 或反之亦然,除非有其他变量来保存上述新值。

    【讨论】:

      【解决方案2】:

      不,它们不一样。

      当您编写 a,b = b, a+b 时,作业是“同时”完成的。 a,b = b, a+b(a, b) = (b, a+b) 相同。所以,之后

      a, b = 5, 8
      

      a=5 和 b=8。当 Python 看到这个

      (a, b) = (b, a+b)
      

      首先计算右侧(b, a+b)(8,13)然后将(这个元组)分配给左侧,给(a,b)


      当你有:a = b 然后b = a+b,这两个操作一个接一个地完成。但对于他们每一个人:

      a = b
      

      首先计算右侧b然后将(这个值)分配给左侧,给a。再说一遍

      b = a + b
      

      首先计算右侧a + b然后将(这个值)分配给左侧,给b

      【讨论】:

      • 元组是不可变的,因此任何进入元组的内容都将被保留(只读)。即使在左侧分配了 A 和 B,但首先创建右侧的元组(从右到左分配)。
      • “同时”不仅在技术上是错误的,而且会混淆问题。关键是在进行任何赋值之前,对右侧的 all 表达式求值。所以a = a + ba, b = b, a + b之间真的没有区别——在这两种情况下,右边的值都是使用ab的“旧”值计算的。
      【解决方案3】:

      第二个例子表示一个用于执行“同时”分配的元组。

      (A,B)=(B,A+B)
      

      元组是不可变的,这意味着它们的内容一旦设置就不能更改。此外,Python 处理从右到左的赋值。所以当右边的元组被创建时,即使左边的 A & B 被分配了新的值,值也不会改变。

      【讨论】:

      • "Simultaneous" 用引号引起来,因为在内部它不会同时执行两项任务。
      • 同意,“同时”混淆了这个问题。关键是右边的表达式在执行任何赋值之前被评估。真的和a = a + b没什么区别。
      【解决方案4】:

      为此:

      a,b = b, a+b
      

      首先评估右侧的所有内容,然后分配给左侧。因此,在左侧分配 a 之前,您正在使用右侧的 a 的值。

      为此:

      a = b
      b = a+b
      

      a的值在第二条语句执行之前被改变。所以你的结果是不同的。

      【讨论】:

        【解决方案5】:

        这些说法是不同的。

        a = b
        b = a+b
        

        修改a,然后使用修改后的值更改b。实际上,它总是b = b + b

        a,b = b, a+b
        

        同时更改ba,因此b 使用原始a 值计算。

        【讨论】:

          【解决方案6】:

          它们不一样。在第一个示例中,a 被赋值为b,然后将其新值添加到b。有效b + b

          在第二个示例中,a 被分配了b 的当前值,b 被分配了a 的当前值加上b 的当前值。它发生在a 的值发生变化之前。

          这两个分配同时发生而不是顺序发生。

          【讨论】:

            猜你喜欢
            • 2015-02-25
            • 2017-09-13
            • 1970-01-01
            • 2021-11-17
            • 2014-09-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多