[問題] funcion的參數問題

看板Python作者 (累人啊....)時間10年前 (2015/07/15 10:27), 編輯推噓2(2017)
留言19則, 4人參與, 最新討論串1/3 (看更多)
請問一下下面的範例 def func(_List): _List.append("a") def func2(_int): _int+=10 testList = [] testList.append("1") testInt = 1 func(testList) func2(testInt) print(len(testList)) print(testInt) 出來的結果是2和1 testInt結果是我所預期的沒問題,問題在於func 我傳進去的的List為什麼會被改變? 我希望傳list進去後產生一個副本,副本可以被改變,但是原始的list不要作變動 那麼我的func該如何修改? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.52.121 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1436927248.A.A83.html

07/15 10:28, , 1F
用 list[:] 可以拷貝
07/15 10:28, 1F

07/15 10:29, , 2F
Python 的 = 都是 pointer assignment, 不會隱性拷貝
07/15 10:29, 2F

07/15 10:32, , 3F
我在func內加了__list = _List,我看這兩個List的記憶體
07/15 10:32, 3F

07/15 10:32, , 4F
並不是指向同一位置阿
07/15 10:32, 4F

07/15 10:35, , 5F
記憶體? 你怎麼"看"? 如果是 id() 那一定是一樣的
07/15 10:35, 5F

07/15 10:36, , 6F
喔喔...我誤會了,謝謝
07/15 10:36, 6F

07/15 12:47, , 7F
當python寫下a=b時,實際上他表示的不是你過去認知的樣子
07/15 12:47, 7F

07/15 12:48, , 8F
a=b的意思是: 變數a參考變數b所指向的物件
07/15 12:48, 8F

07/15 12:49, , 9F
如果b本身直接是一個物件那麼,例如a=[],那麼a就是直接參考
07/15 12:49, 9F

07/15 12:50, , 10F
記憶體裡面所佔據的那個物件
07/15 12:50, 10F

07/15 12:52, , 11F
然後python 物件又分 mutable以及immutable
07/15 12:52, 11F

07/15 12:53, , 12F
mutable的意思是物件本身可不可以更改,基本上list是mutable
07/15 12:53, 12F

07/15 12:54, , 13F
一般整數變數是immutable
07/15 12:54, 13F

07/15 12:56, , 14F
mutable我在講清楚一點好了 mutable代表物件本身可以擴增
07/15 12:56, 14F

07/15 12:58, , 15F
所以在你的例子裡_List它本身可以擴增,但如果你把
07/15 12:58, 15F

07/15 12:59, , 16F
_List.append('a')改成 _List=['b']那麼,_List就會指向['b']
07/15 12:59, 16F

07/15 13:01, , 17F
外面傳進來的list物件此時不會受到影響
07/15 13:01, 17F

07/15 13:03, , 18F
這個樣的情況就會跟你func2的例子一樣,func2裡面的_int
07/15 13:03, 18F

07/15 13:04, , 19F
會指向新的結果物件。
07/15 13:04, 19F
文章代碼(AID): #1LfSKGg3 (Python)
討論串 (同標題文章)
文章代碼(AID): #1LfSKGg3 (Python)