【问题标题】:What is difference between x,y = y,y+x and x=y , y=x+y?x,y = y,y+x 和 x=y , y=x+y 有什么区别?
【发布时间】:2018-04-20 12:09:58
【问题描述】:

我刚刚编写了这些代码,但输出不同。第二个代码的输出与我预期的一样正确,但第一个代码的输出不正确。但为什么呢?

def fib(n):
    x = 0
    y = 1
    print x
    for i in range(n):
        x = y
        y = x+y
        print x
    return x

输出是;当 n = 5

0
1
2
4
8
16


def fib(n):
    x,y = 0,1
    print x
    for i in range(n):
        x,y = y,x+y
        print x
    return x

输出是;当 n = 5

0
1
1
2
3
5

第二个代码是正确的,但是, x,y = y,x+yx = y , y = x+y 它们看起来一样,但输出不同,为什么?

【问题讨论】:

  • 在后一种情况下,y 不会在右侧更新,xy 将根据 old 值分配y。使用 y 的旧值构造元组 (y,x+y),然后将这个元组解包为左侧的 xy 的新值。在第一种情况下,x 会在您尝试计算 y 时更新,因此您会得到错误的结果。
  • 您需要一个用于旧值x 的临时变量,就像在大多数语言中一样。在python中我会使用第二个,它更优雅、更干净:)

标签: python variable-assignment fibonacci


【解决方案1】:

它们给出不同的输出,因为 x=y,然后 y=x+y,您将 x 设置为 y 的值。然后你取 x,一旦它的值被更新并将它添加到 y 以找到 y 变量。在方程的 y = y+x 部分中使用单行变量声明 (x,y=y,y+x),它将使用 x 的先前值而不是您在该行中设置的值。

如果你有:

x=0
y=1

然后你尝试了一行声明,它看起来像这样:

x,y=1,0+1
x,y=y,x+y

我希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    不同的是,在第一个例子中你会更新x然后使用它,而在第二个例子中你将直接使用它。

    x, y = 0, 1
    x = y     # after this line x will be 1
    y = x + y   # y = 1 + 1
    

    第二个例子

    x,y = 0, 1
    x,y = y,x+y  # x, y = (1, 0 + 1) the old value of x will be used
    

    这是因为它将首先在右侧生成元组,然后,您的情况下的元组 (1, 1) 将被分配给 xy

    【讨论】:

      【解决方案3】:

      如果您想不使用元组,则必须先将 x 的值分配给一个新变量 z,然后再用 y 的值更新它,并使用这个新变量来计算 y 的值。 代码来自不同的问题,但输出是斐波那契数列。

          x = 0
          y = 1
          print(x)
          while y < 50:
              print(y)
              z = x
              x = y
              y = z+y
      

      【讨论】:

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