如下例:
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 到底是怎么产生的?
如下例:
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 到底是怎么产生的?
|
kenorizonMay 18, 2018 via iPhone
1
list(range(0)) == []
|
|
mofeMay 18, 2018
2
for x in range(0) ,所以后面的赋值语句没有跑。。。
|
|
IanPeverellMay 18, 2018
3
a, b = b, a+b
完成的工作相当于 c = a a = b b = c+b |
|
wellscMay 18, 2018
4
后面那个 1 难道不是你自己赋值的?
```python a, b = 1, 1 ``` range(0) 的结果就是空列表好嘛?根本没有跑进循环体啊 ``` python >>> for i in range(0): ... print('进来了吗') ... >>> print(range(0)) [] >>> ``` |
|
5
|
|
gnaggnoyilMay 18, 2018
6
@Eyon `f[0]`等于`f.__getitem__(0)`...
|
|
8
|
|
NostalgiaaaaMay 18, 2018
9
a, b = b, a+b
这个其实是元组赋值了,python 会自动把右边这种用逗号分开的格式作为元组, 例如: >>> a = 1, 2 >>> type(a) <class 'tuple'> >>> c, d = a >>> c, d (1, 2) 也就是这个语句大概上就是个语法糖, 右边是多个值赋值, 左边是元组。 |
|
F1024May 18, 2018
10
你至少要给 n 赋个值吧
|
|
PythonAnswerMay 18, 2018 via iPhone
11
Fib 一般有个 if 吧
|
|
OldPandaMay 19, 2018
12
把这个 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。 |
|
pmispigMay 19, 2018
13
这样写的是傻逼
|
|
opengpsMay 19, 2018 via Android
14
true 可以用 1 表示
|
|
AlisaDestinyMay 20, 2018
15
for x in range(3) 你知道是运行 3 次,那 for x in range(0) 是运行 1 次?是你犯糊了还是我犯糊了。
|