
如下例:
class Fib(object): def __getitem__(self, n): a, b = 1, 1 for x in range(n): a, b = b, a + b return a,b f = Fib() print(f[0]) 输出为什么是(1,1),而不是( 1,2 )?后面那个 1 到底是怎么产生的?
1 kenorizon 2018-05-18 17:42:38 +08:00 via iPhone list(range(0)) == [] |
2 mofe 2018-05-18 17:42:47 +08:00 for x in range(0) ,所以后面的赋值语句没有跑。。。 |
3 IanPeverell 2018-05-18 17:43:02 +08:00 a, b = b, a+b 完成的工作相当于 c = a a = b b = c+b |
4 wellsc 2018-05-18 17:43:22 +08:00 后面那个 1 难道不是你自己赋值的? ```python a, b = 1, 1 ``` range(0) 的结果就是空列表好嘛?根本没有跑进循环体啊 ``` python >>> for i in range(0): ... print('进来了吗') ... >>> print(range(0)) [] >>> ``` |
5 Eyon OP |
6 gnaggnoyil 2018-05-18 17:59:24 +08:00 @Eyon `f[0]`等于`f.__getitem__(0)`... |
7 mofe 2018-05-18 18:03:07 +08:00 |
8 Eyon OP |
9 Nostalgiaaaa 2018-05-18 18:56:56 +08:00 a, b = b, a+b 这个其实是元组赋值了,python 会自动把右边这种用逗号分开的格式作为元组, 例如: >>> a = 1, 2 >>> type(a) <class 'tuple'> >>> c, d = a >>> c, d (1, 2) 也就是这个语句大概上就是个语法糖, 右边是多个值赋值, 左边是元组。 |
10 F1024 2018-05-18 19:38:18 +08:00 你至少要给 n 赋个值吧 |
11 PythonAnswer 2018-05-18 19:42:18 +08:00 via iPhone Fib 一般有个 if 吧 |
12 OldPanda 2018-05-19 05:29:00 +08:00 把这个 Fib 类转换成字节码可以看到,for 循环内部是这个样子的 5 22 LOAD_FAST 3 (b) 24 LOAD_FAST 2 (a) 26 LOAD_FAST 3 (b) 28 BINARY_ADD 30 ROT_TWO 32 STORE_FAST 2 (a) 34 STORE_FAST 3 (b) 36 JUMP_ABSOLUTE 18 >> 38 POP_BLOCK 可以看到按照 b, a, b 的顺序压栈,然后对栈顶的两个元素进行相加(即 a + b ),然后分别存到 b, a (这里故意写反,因为中间有一个 ROT_TWO 操作)。所以说白了,Python 先把 b, a + b 的值分别准备好,再依次交给原有的 a, b。 |
13 pmispig 2018-05-19 15:11:25 +08:00 这样写的是傻逼 |
14 opengps 2018-05-19 17:58:51 +08:00 via Android true 可以用 1 表示 |
15 AlisaDestiny 2018-05-20 16:36:21 +08:00 for x in range(3) 你知道是运行 3 次,那 for x in range(0) 是运行 1 次?是你犯糊了还是我犯糊了。 |