V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ljcarsenal
V2EX  ›  Python

a,b=b,a+b 计算和赋值的顺序是怎样的??

  •  1
     
  •   ljcarsenal · 2014-05-22 00:28:10 +08:00 · 5367 次点击
    这是一个创建于 3840 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看到用这个实现的斐波那契函数,表示不太理解
    26 条回复    2014-05-24 10:13:01 +08:00
    davidli
        1
    davidli  
       2014-05-22 01:01:34 +08:00
    类似于但不知道是不是等价于:
    t=a+b
    a=b
    b=t
    话说我来V2时的第一个问题也是这个。。。真有缘
    11
        2
    11  
       2014-05-22 01:03:28 +08:00
    c,d=b,a+b
    a,b=c,d
    dorentus
        3
    dorentus  
       2014-05-22 01:07:20 +08:00 via iPad
    我猜是等价于:

    x, y = b, a + b
    a, b = x, y
    dorentus
        4
    dorentus  
       2014-05-22 01:09:33 +08:00 via iPad
    @dorentus 然后我发现这个和之前没看明白的 2 楼的答案是一模一样的…
    jsonline
        5
    jsonline  
       2014-05-22 01:29:04 +08:00
    为什么要写这样的代码?拖出去打
    dreampuf
        6
    dreampuf  
       2014-05-22 02:08:01 +08:00   ❤️ 2
    $ python -c 'import dis; dis.dis(compile("a,b=b,a+b", "_", "single"))'
    1 0 LOAD_NAME 0 (b)
    3 LOAD_NAME 1 (a)
    6 LOAD_NAME 0 (b)
    9 BINARY_ADD
    10 ROT_TWO
    11 STORE_NAME 1 (a)
    14 STORE_NAME 0 (b)
    17 LOAD_CONST 0 (None)
    20 RETURN_VALUE
    ichou
        7
    ichou  
       2014-05-22 02:17:37 +08:00
    先返回 再赋值
    HatMatrix
        8
    HatMatrix  
       2014-05-22 08:55:57 +08:00
    这样写代码真的好么?少打几个字又不能买套房子
    Mutoo
        9
    Mutoo  
       2014-05-22 09:54:12 +08:00
    @HatMatrix 有很多极限编程的比赛,就是看谁的代码短小精悍。得奖了还真的能买套房子。

    http://codegolf.stackexchange.com/
    http://js1k.com/
    simaoji
        10
    simaoji  
       2014-05-22 09:56:57 +08:00
    斐波那契数列的迭代计算?
    计算过程使用状态变量描述,效率高一些。
    (fib-iter (+ a b) a (- count 1))
    a = a+b
    b = a
    zog
        11
    zog  
       2014-05-22 10:03:04 +08:00
    tuple赋值,左边a,b是变量,右边b,a+b是对象。a对象赋值给变量a,a+b对象赋值给b。上边有朋友用python -c描述了执行顺序。
    MasterYoda
        12
    MasterYoda  
       2014-05-22 10:05:56 +08:00
    @Mutoo
    哈哈,这么严肃的回复好无情。。
    for4
        13
    for4  
       2014-05-22 10:08:36 +08:00
    从右到走
    先运算再逻辑

    顺便吐槽,“a,b=b,a+b”这个太直白了。
    for4
        14
    for4  
       2014-05-22 10:08:46 +08:00
    从右到左
    simaoji
        15
    simaoji  
       2014-05-22 10:09:48 +08:00
    好吧,没审题…… 理解错了
    simaoji
        16
    simaoji  
       2014-05-22 10:12:53 +08:00
    应该是是从右到左吧
    Kabie
        17
    Kabie  
       2014-05-22 10:21:13 +08:00
    。。。非常常见的用法吧。。。谁用中间变量才要拖出去打呢。。。
    lu18887
        18
    lu18887  
       2014-05-22 11:35:45 +08:00
    这是并行赋值吧,比较典型的应用就是交换两个变量的值
    hahastudio
        19
    hahastudio  
       2014-05-22 11:43:02 +08:00
    tmp_tuple = (b, a+b)
    a = tmp_tuple[0]
    b = tmp_tuple[1]
    jiang42
        20
    jiang42  
       2014-05-22 12:40:38 +08:00
    我果然还是不够pythonic。。。
    看半天以为是 C 代码
    然后看回复才想起来这是unpacking
    glasslion
        21
    glasslion  
       2014-05-22 12:44:05 +08:00   ❤️ 1
    @jsonline
    @HatMatrix 不这样写的Python程序员应该被开除
    tioover
        22
    tioover  
       2014-05-22 14:28:21 +08:00
    先算出左右两边的tuple然后赋值
    bravluna
        23
    bravluna  
       2014-05-22 19:35:05 +08:00
    py 会临时建立个 tuple (b, a+b),这样就明白了吧?
    bravluna
        24
    bravluna  
       2014-05-22 19:37:43 +08:00
    所以 py 里交换变量值不需要再来个临时变量:a,b = b,a ,就可以交换
    HatMatrix
        25
    HatMatrix  
       2014-05-23 08:57:11 +08:00
    @glasslion 一直以为是C代码 ⊙﹏⊙b汗
    hooluupog
        26
    hooluupog  
       2014-05-24 10:13:01 +08:00
    对于多变量赋值语句a,b = b,a 编译器会首先计算完右边的变量值然后依次进行赋值(当然,有的语言支持惰性求值的情况例外)。所以:
    a=1
    b=2
    a,b=b,a
    其实就是:a,b = 2,1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3612 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 05:01 · PVG 13:01 · LAX 21:01 · JFK 00:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.