[問題] 令函數引數的預設值為list或dictionary

看板Python作者 (薩滿魂)時間16年前 (2008/10/18 17:46), 編輯推噓3(3016)
留言19則, 3人參與, 最新討論串1/1
我發現一個很奇怪的東西,但是不知道為什麼會這樣,所以丟上來請問一下: 首先我定義一個函數,他會回傳一個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

10/18 20:51, , 1F
真神奇@@
10/18 20:51, 1F

10/18 21:09, , 3F
下面粗體字那裡Default parameter values are ...
10/18 21:09, 3F

10/18 21:11, , 4F
大意是Default parameter只會被定義一次
10/18 21:11, 4F

10/18 21:12, , 5F
如果他被定義為一個多變的變數 list or dict就像你寫這樣
10/18 21:12, 5F

10/18 21:12, , 6F
當該變數改變的時候Default parameter自然會改變
10/18 21:12, 6F

10/18 21:13, , 7F
不會每次都從新定義
10/18 21:13, 7F

10/18 23:09, , 8F
喔喔了解
10/18 23:09, 8F

10/18 23:09, , 9F
補一個測試結果
10/18 23:09, 9F

10/18 23:09, , 10F
>>> def f(n,a=[]):
10/18 23:09, 10F

10/18 23:10, , 11F
... a.append(n)
10/18 23:10, 11F

10/18 23:10, , 12F
... return a
10/18 23:10, 12F

10/18 23:10, , 13F
...
10/18 23:10, 13F

10/18 23:10, , 14F
>>> print f(1),f(2),f(3)
10/18 23:10, 14F

10/18 23:10, , 15F
[1] [1, 2] [1, 2, 3]
10/18 23:10, 15F

10/18 23:10, , 16F
>>>
10/18 23:10, 16F

10/18 23:11, , 17F
>>> print f(1,[]),f(2)
10/18 23:11, 17F

10/18 23:11, , 18F
[1] [1, 2, 3, 2]
10/18 23:11, 18F

10/19 23:42, , 19F
10/19 23:42, 19F
文章代碼(AID): #18-R1Q3K (Python)
文章代碼(AID): #18-R1Q3K (Python)