[問題] def函式之輸入變數會隨函式內容改變

看板Python作者 (14號星期五的傑森)時間5年前 (2020/07/16 09:55), 5年前編輯推噓3(304)
留言7則, 6人參與, 5年前最新討論串1/1
各位前輩好 小弟有一個新手級問題 先上程式碼 def xxx(d): d[0]=123 return d a=[1,2] b=xxx(a) 在程式碼中,我設定變數a為[1,2] 但將a丟到def中,得到b的同時,a也會隨之改變 想請問造成這個現象的原因 是否為 a是一個全域變數,而在函式中的d是a的shallow copy所致? 若不是的話,還盼望版友們能指導小弟造成此現象的原因為何 先謝謝版友撥空閱讀我的疑問 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.22.64.145 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1594864528.A.97D.html

07/16 09:59, 5年前 , 1F
因為你是送了reference過去
07/16 09:59, 1F

07/16 10:16, 5年前 , 2F
python是call by object list相當於傳reference
07/16 10:16, 2F
先謝謝版友們的回答,剛剛也google後才大致了解 pass by reference跟pass by value之別 所以看起來python是根據不同情況去pass value或reference囉? 那解決之道就是在函式內又在設一個變數嗎? 以上例來說,應修正為 def xxx(d): y=d y[0]=123 return y ※ 編輯: jasonhsu14 (211.22.64.145 臺灣), 07/16/2020 10:23:52 ※ 編輯: jasonhsu14 (211.22.64.145 臺灣), 07/16/2020 10:26:31

07/16 10:52, 5年前 , 3F
要改成y=d[:] 一般來說要傳list會寫成 def xxx(d=None):
07/16 10:52, 3F

07/16 10:52, 5年前 , 4F
用 y=d[:] 複製一份,或是你要用 y=copy.copy(d)
07/16 10:52, 4F

07/16 10:53, 5年前 , 5F
函式裡面判斷if not d成立 d = []
07/16 10:53, 5F

07/16 10:55, 5年前 , 6F
shalow/deep copy, reference
07/16 10:55, 6F

07/18 01:27, 5年前 , 7F
python中alway是pass by pointer,不會有不同情況
07/18 01:27, 7F
文章代碼(AID): #1V3xEGbz (Python)
文章代碼(AID): #1V3xEGbz (Python)