【问题标题】:When splitting the assignment operation (n1,n2 = n2, n1+ n2 ) below, into n2 = n1+n2 and n1=n2 separately, the code doesn't work properly, why?将下面的赋值操作(n1,n2 = n2, n1+ n2)拆分为 n2 = n1+n2 和 n1=n2 时,代码不能正常工作,为什么?
【发布时间】:2022-01-19 17:04:47
【问题描述】:

伙计们,我正在尝试打印斐波那契数列的前 8 个元素,并且只想了解一段代码。在单行(n1,n2 = n2,n1+ n2)中执行赋值操作时,代码工作正常,但是当将相同的赋值操作拆分为单独的行(如(n2 = n1+n2 和 n1=n2)时,我得到不同结果和代码无法正常工作,请解释一下原因?

def generate_fibonacci():
    n1 = 0
    n2 = 1
    while True:
        yield n1
        n1,n2 = n2, n1+ n2 // this piece of code doesn't work properly when separating it
        # n2 = n1 + n2
        # n1 = n2
        
seq = generate_fibonacci()

for i in range(8):
    print(next(seq))

【问题讨论】:

  • 如果您拆分该行,那么您第二次执行的部分将使用第一部分中变量的 值,而不是旧值。
  • 分开行时,取n2的最新值(n1+n2),赋值给n1
  • n1,n2 = n2, n1+ n2 使用此代码,n1 被分配给 n2original 值。

标签: python variable-assignment


【解决方案1】:
n2 = n1 + n2
n1 = n2

使用此代码,n1n2 都以 相同 值结束 - 原始 n1n2 的总和。

n1,n2 = n2, n1+ n2

使用此代码,n1n2原始 值结束,n2 以原始 n1n2 的总和结束。

【讨论】:

    【解决方案2】:

    当您执行n1,n2 = n2,n1+n2 时,Python 在执行分配之前将右侧的值存储在临时内存中。所以n1+n2是在改变n1之前计算出来的(从而避免了在分配过程中的干扰)。

    如果您分两行执行此操作,则会丢失其中一个变量的原始值。但是,由于斐波那契数列的性质,您可以对其进行补偿并检索原始值:

    def generate_fibonacci():
        n1 = 0
        n2 = 1
        while True:
            yield n1
            n2=n1+n2  # n2 gets a new value
            n1=n2-n1  # recover original value of n2
    

    【讨论】:

      【解决方案3】:

      如果在n1 之前更改n2,那么n1 更改为n2 的新值而不是原始值,因此它们具有相同的值。

      同样,先更改n1 会使n2 的值不正确。

      如果您想拆分代码,则有两种选择。第一个在任何情况下都有效,是将一个变量的原始值存储在另一个变量中:

      temp = n2
      n2 = n1 + n2
      n1 = temp
      

      第二个选项仅在这种情况下有效,计算n1 的be 值,同时考虑n2 的值已更改的事实:

      n2 = n1 + n2
      n1 = n2 - n1
      

      【讨论】:

      • 没有办法拆分吗?有没有关于这些特殊情况的官方 Python 参考资料
      • 我已经更新了答案,包括一些可能的拆分代码的方法。
      猜你喜欢
      • 2014-05-07
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      相关资源
      最近更新 更多