作者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
推 superGA:真神奇@@ 10/18 20:51
→ superGA:下面粗體字那裡Default parameter values are ... 10/18 21:09
→ superGA:大意是Default parameter只會被定義一次 10/18 21:11
→ superGA:如果他被定義為一個多變的變數 list or dict就像你寫這樣 10/18 21:12
→ superGA:當該變數改變的時候Default parameter自然會改變 10/18 21:12
→ superGA:不會每次都從新定義 10/18 21:13
→ apua:喔喔了解 10/18 23:09
→ apua:補一個測試結果 10/18 23:09
→ apua:>>> def f(n,a=[]): 10/18 23:09
→ apua:... a.append(n) 10/18 23:10
→ apua:... return a 10/18 23:10
→ apua:... 10/18 23:10
→ apua:>>> print f(1),f(2),f(3) 10/18 23:10
→ apua:[1] [1, 2] [1, 2, 3] 10/18 23:10
→ apua:>>> 10/18 23:10
→ apua:>>> print f(1,[]),f(2) 10/18 23:11
→ apua:[1] [1, 2, 3, 2] 10/18 23:11
推 rexrainbow:推 10/19 23:42