作者apua (萨满魂)
看板Python
标题[问题] 函数回传generator
时间Sat Oct 18 17:46:01 2008
我发现一个很奇怪的东西,但是不知道为什麽会这样,所以丢上来请问一下:
首先我定义一个函数,他会回传一个generator....
>>> def f(n):
... return (i for i in range(n,10))
...
>>> f(2).next(),f(2).next(),f(2).next()
(2, 2, 2)
因为每次跑f(2),就会回传一个全新的generator,所以每次都会从头抓值出来。
接下来这样做也是同样的道理....
>>> def g(n):
... d={}
... return d.setdefault(n,(i for i in range(n,10)))
...
>>> g(3).next(),g(3).next(),g(3).next()
(3, 3, 3)
但是为什麽我把dictionary放到引数里,他就不会再重制了?
>>> def h(n,
d={}):
... return d.setdefault(n,(i for i in range(n,10)))
...
>>> h(4).next(),h(4).next(),h(4).next()
(4, 5, 6)
>>> def h(n,d={}):
... return d.setdefault(
1,(i for i in range(n,10))) # n改成1也没差
...
>>> h(4).next(),h(4).next(),h(4).next()
(4, 5, 6)
我不懂的是函数运作的原理;为什麽把dictionary丢到引数里,函数h 就知道如何找到原
本回传出的generator?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 124.6.25.237
1F:推 superGA:真神奇@@ 10/18 20:51
3F:→ superGA:下面粗体字那里Default parameter values are ... 10/18 21:09
4F:→ superGA:大意是Default parameter只会被定义一次 10/18 21:11
5F:→ superGA:如果他被定义为一个多变的变数 list or dict就像你写这样 10/18 21:12
6F:→ superGA:当该变数改变的时候Default parameter自然会改变 10/18 21:12
7F:→ superGA:不会每次都从新定义 10/18 21:13
8F:→ apua:喔喔了解 10/18 23:09
9F:→ apua:补一个测试结果 10/18 23:09
10F:→ apua:>>> def f(n,a=[]): 10/18 23:09
11F:→ apua:... a.append(n) 10/18 23:10
12F:→ apua:... return a 10/18 23:10
13F:→ apua:... 10/18 23:10
14F:→ apua:>>> print f(1),f(2),f(3) 10/18 23:10
15F:→ apua:[1] [1, 2] [1, 2, 3] 10/18 23:10
16F:→ apua:>>> 10/18 23:10
17F:→ apua:>>> print f(1,[]),f(2) 10/18 23:11
18F:→ apua:[1] [1, 2, 3, 2] 10/18 23:11
19F:推 rexrainbow:推 10/19 23:42