![]() | 1 davidli 2014-05-22 01:01:34 +08:00 类似于但不知道是不是等价于: t=a+b a=b b=t 话说我来V2时的第一个问题也是这个。。。真有缘 |
![]() | 2 11 2014-05-22 01:03:28 +08:00 c,d=b,a+b a,b=c,d |
![]() | 3 dorentus 2014-05-22 01:07:20 +08:00 via iPad 我猜是等价于: x, y = b, a + b a, b = x, y |
![]() | 6 dreampuf 2014-05-22 02:08:01 +08:00 ![]() $ 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 |
![]() | 7 ichou 2014-05-22 02:17:37 +08:00 先返回 再赋值 |
![]() | 8 HatMatrix 2014-05-22 08:55:57 +08:00 这样写代码真的好么?少打几个字又不能买套房子 |
![]() | 9 Mutoo 2014-05-22 09:54:12 +08:00 |
10 simaoji 2014-05-22 09:56:57 +08:00 斐波那契数列的迭代计算? 计算过程使用状态变量描述,效率高一些。 (fib-iter (+ a b) a (- count 1)) a = a+b b = a |
![]() | 11 zog 2014-05-22 10:03:04 +08:00 tuple赋值,左边a,b是变量,右边b,a+b是对象。a对象赋值给变量a,a+b对象赋值给b。上边有朋友用python -c描述了执行顺序。 |
![]() | 12 MasterYoda 2014-05-22 10:05:56 +08:00 @Mutoo 哈哈,这么严肃的回复好无情。。 |
13 for4 2014-05-22 10:08:36 +08:00 从右到走 先运算再逻辑 顺便吐槽,“a,b=b,a+b”这个太直白了。 |
14 for4 2014-05-22 10:08:46 +08:00 从右到左 |
15 simaoji 2014-05-22 10:09:48 +08:00 好吧,没审题…… 理解错了 |
16 simaoji 2014-05-22 10:12:53 +08:00 应该是是从右到左吧 |
17 Kabie 2014-05-22 10:21:13 +08:00 。。。非常常见的用法吧。。。谁用中间变量才要拖出去打呢。。。 |
![]() | 18 lu18887 2014-05-22 11:35:45 +08:00 这是并行赋值吧,比较典型的应用就是交换两个变量的值 |
![]() | 19 hahastudio 2014-05-22 11:43:02 +08:00 tmp_tuple = (b, a+b) a = tmp_tuple[0] b = tmp_tuple[1] |
20 jiang42 2014-05-22 12:40:38 +08:00 我果然还是不够pythonic。。。 看半天以为是 C 代码 然后看回复才想起来这是unpacking |
![]() | 22 tioover 2014-05-22 14:28:21 +08:00 先算出左右两边的tuple然后赋值 |
![]() | 23 bravluna 2014-05-22 19:35:05 +08:00 py 会临时建立个 tuple (b, a+b),这样就明白了吧? |
![]() | 24 bravluna 2014-05-22 19:37:43 +08:00 所以 py 里交换变量值不需要再来个临时变量:a,b = b,a ,就可以交换 |
![]() | 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 |