Python x,y=y,y+;x和x=y,y=x+;Y

Python x,y=y,y+;x和x=y,y=x+;Y,python,variable-assignment,fibonacci,Python,Variable Assignment,Fibonacci,我刚刚写了这些代码,但输出是不同的。第二个代码的输出是我所期望的正确的,但是第一个代码的输出是不正确的。但是为什么呢 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

我刚刚写了这些代码,但输出是不同的。第二个代码的输出是我所期望的正确的,但是第一个代码的输出是不正确的。但是为什么呢

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
0
1
1
2
3
5
输出为;当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
0
1
1
2
3
5
第二个代码是正确的,但是,
x,y=y,x+y
x=y,y=x+y

它们看起来一样,但输出不同为什么?

它们给出不同的输出,因为当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

我希望这有帮助:)

不同之处在于,您将更新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)
将分配给
x
y

,在用y值更新变量z之前,必须将x的值赋给新变量z,并使用此新变量计算y的值。 代码来自不同的问题,但输出是斐波那契序列

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

在后一种情况下,
y
不会在右侧更新,
x
y
都将基于
y
的旧值进行分配。使用
y
的旧值构建元组
(y,x+y)
,然后将该元组解压为左侧的
x
y
的新值。在第一种情况下,
x
在您尝试计算
y
时被更新,因此您得到了错误的结果。与大多数语言一样,您需要为
x
的旧值设置一个临时变量。在python中,我会使用第二个,它更优雅、更简洁:)