Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么只有在我使用';x、 y=y,x+;y格式而不是';x=y;y=x+;y';?_Python_Variables - Fatal编程技术网

Python 为什么只有在我使用';x、 y=y,x+;y格式而不是';x=y;y=x+;y';?

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

我正在进行euler项目,但这不是重点。我正在写一个快速的代码来打印斐波那契序列。实际上,我有一个不同的eueler项目方程代码,但这基本上是我使用的算法:

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。我想如果你用工作版本中的最后一行替换原始版本中的最后两行,两个版本都能正常工作。