如下例:
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 次?是你犯糊了还是我犯糊了。
|