为了账号安全,请及时绑定邮箱和手机立即绑定

a, b = b , a+b 是不是等同于如下写法?为什么结果不对呢。

a, b = b , a+b

是不是等同于

a = b

b= a+b

即:

class Fib(object):

    def __call__(self, num):

        a, b, L = 0, 1, []

        for n in range(num):

            L.append(a)

            a = b

            b = a + b

        return L


f = Fib()

print f(10)


这样输出结果是错的。为什么?


正在回答

6 回答

如果把表达式写在同一行是没问题的,因为他们相当于同时进行计算,但如果分开写成两行就会出现问题,因为计算b=a+b的时候a的值已经发生了变化,第二行相当于b*=2,可以参考如下代码

        L=[]

        a=0

        b=1

        L.append(a)

        x=1

        while x<number:

            t=a

            a=b

            b=b+t

            L.append(a)

            x+=1

        return L


0 回复 有任何疑惑可以回复我~

a,b=b,a+b 这种赋值方式是先计算等式右边,再把计算结果赋值给等式左边。而a=b,b=a+b,这样是先把b的值赋给a,然后再计算b=a+b,就变成了b=b+b了

1 回复 有任何疑惑可以回复我~

两行搞定 

fei = lambda n : n if n == 0 or n <=2 else fei(n-1)+fei(n-2)

fei_lst = [fei(n) for n in range(7)] 

但 是开头少个1


0 回复 有任何疑惑可以回复我~

俺自个儿摸索出来的 现在能写出来的

a = 1
b = 0
c = []
for i in range(7):
    if i == 0:
        c.append(i)
    a, b = b, a+b

    c.append(b)
print(c)


a, b = b , a+b

不等同于

a = b

b= a+b

而是

c = b 

b = a+b

a = c



0 回复 有任何疑惑可以回复我~

教程代码写的什么鬼,看不懂。

我自己写的 好理解:


class Fib1(object):

    def __call__(self, num):

        

        L = [0,1]

        for n in range(2,num):

            Ln=L[n-2]+L[n-1]

            L.append(Ln)

        return L


f = Fib1()

print f(10)


[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]


0 回复 有任何疑惑可以回复我~


上述输出结果是

[0, 1, 2, 4, 8, 16, 32, 64, 128, 256]

正确答案是这样的:

class Fib(object):

    def __call__(self, num):

        a, b, L = 0, 1, []

        for n in range(num):

            L.append(a)

            a, b = b, a + b

        return L


f = Fib()

print f(10)

输出结果是:

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]





0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255793    人
  • 解答问题       2946    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

a, b = b , a+b 是不是等同于如下写法?为什么结果不对呢。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信