Python 为什么只有在我使用';x、 y=y,x+;y格式而不是';x=y;y=x+;y';?
我正在进行euler项目,但这不是重点。我正在写一个快速的代码来打印斐波那契序列。实际上,我有一个不同的eueler项目方程代码,但这基本上是我使用的算法:Python 为什么只有在我使用';x、 y=y,x+;y格式而不是';x=y;y=x+;y';?,python,variables,Python,Variables,我正在进行euler项目,但这不是重点。我正在写一个快速的代码来打印斐波那契序列。实际上,我有一个不同的eueler项目方程代码,但这基本上是我使用的算法: x = 1 y = 0 while x < 4000000: print x x = y y = x + y x=1 y=0 当x
x = 1
y = 0
while x < 4000000:
print x
x = y
y = x + y
x=1
y=0
当x<4000000时:
打印x
x=y
y=x+y
这让我烦躁了一段时间,这本应该奏效的。然后我研究了一下,发现几乎相同的代码,但格式有点不同。成功了!唯一的区别是它将x和y赋值放在一行中,用逗号分隔。所以我试了一下:
x , y = 1 , 0
while x < 4000000:
print x
x,y = y, x + y
x,y=1,0
当x<4000000时:
打印x
x、 y=y,x+y
很明显,正如我所说,它起了作用。这真的让我很困扰,因为我不知道这两者之间的区别是什么,除了在第二行中使用更少的行之外。我不明白为什么输出不同。为什么输出不同?我猜在第二个版本中,当它计算
y,x+y时,它使用x+y中x的原始值
在两行版本中,当它计算x+y
x时,x被设置为y,这导致x+y与y+y相同,我猜在第二个版本中,当它计算y时,x+y
在x+y中使用x的原始值
在两行版本中,当它计算x+y
x时,x已设置为y,这导致x+y与y+y
相同,您重新指定了x
让我们举一个数字例子
案例1:
x = 4
y = 2
x = y = 4
y = x + y = 4 + 4 = 8
案例2:
x = 4
y = 2
x, y = y, x + y = 2, 4 + 2 = 2, 6
因此,在第一种情况下,x是4,y是8,而在第二种情况下,x是2,y是6。您重新指定了x
让我们举一个数字例子
案例1:
x = 4
y = 2
x = y = 4
y = x + y = 4 + 4 = 8
案例2:
x = 4
y = 2
x, y = y, x + y = 2, 4 + 2 = 2, 6
因此,在第一种情况下,x是4,y是8,而在第二种情况下,x是2,y是6。在您的第一个代码中:
x = y
y = x + y
实际上,您正在将y+y
分配给y
。因为x
的值已被覆盖。这不是你想要的,对吗
在您的第二个代码中:
x, y = y, x + y
首先对RHS上的y
和x+y
进行评估,然后将评估值分配给LHS上的x,y
。因此,x+y
不会像第一种情况那样,对x
新赋值产生任何副作用。因此,您的y
将只有x+y
因此,在实际赋值完成之前,RHS
上的两个表达式的求值
是的,while循环之外的任务不会产生任何影响。但是第二种方式看起来更吸引人。在您的第一段代码中:
x = y
y = x + y
实际上,您正在将y+y
分配给y
。因为x
的值已被覆盖。这不是你想要的,对吗
在您的第二个代码中:
x, y = y, x + y
首先对RHS上的y
和x+y
进行评估,然后将评估值分配给LHS上的x,y
。因此,x+y
不会像第一种情况那样,对x
新赋值产生任何副作用。因此,您的y
将只有x+y
因此,在实际赋值完成之前,RHS
上的两个表达式的求值
是的,while循环之外的任务不会产生任何影响。但是第二种方法看起来更吸引人。在第一种版本中,第一个赋值改变了x的值。这会影响下一行赋值中的值。这意味着y=x+y
更像y=y+y
,因为您已经更改了x
在第二个版本中,两个赋值同时完成,因此两个值同时更新。在第一个版本中,第一个赋值会更改x的值。这会影响下一行赋值中的值。这意味着y=x+y
更像y=y+y
,因为您已经更改了x
在第二个版本中,两个赋值同时完成,因此两个值同时更新。这是因为在第x=y
行之后,第二行(y=x+y
)的计算结果为y=y+y
。例如,假设x=2,y=3
那么
另一方面,
x, y = y, x + y # this first assigns values to the right hand side
所以
这是因为在x=y
行之后,第二行(y=x+y
)的计算结果为y=y+y
。例如,假设x=2,y=3
那么
另一方面,
x, y = y, x + y # this first assigns values to the right hand side
所以
我也在想同样的事情,这意味着最后一行的计算结果是y=0+0。我认为,如果用工作版本中的最后一行替换原始版本中的最后两行,两个版本都会按预期工作。我的想法是相同的,这意味着最后一行的计算结果为y=0+0。我想如果你用工作版本中的最后一行替换原始版本中的最后两行,两个版本都能正常工作。