[問題] funcion的參數問題

作者: tyc5116 (累人啊....)   2015-07-15 10:27:23
請問一下下面的範例
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該如何修改?
作者: uranusjr (←這人是超級笨蛋)   2015-07-15 10:28:00
用 list[:] 可以拷貝Python 的 = 都是 pointer assignment, 不會隱性拷貝
作者: tyc5116 (累人啊....)   2015-07-15 10:32:00
我在func內加了__list = _List,我看這兩個List的記憶體並不是指向同一位置阿
作者: bibo9901 (function(){})()   2015-07-15 10:35:00
記憶體? 你怎麼"看"? 如果是 id() 那一定是一樣的
作者: tyc5116 (累人啊....)   2015-07-15 10:36:00
喔喔...我誤會了,謝謝
作者: left (881 forever)   2015-07-15 12:47:00
當python寫下a=b時,實際上他表示的不是你過去認知的樣子a=b的意思是: 變數a參考變數b所指向的物件如果b本身直接是一個物件那麼,例如a=[],那麼a就是直接參考記憶體裡面所佔據的那個物件然後python 物件又分 mutable以及immutablemutable的意思是物件本身可不可以更改,基本上list是mutable一般整數變數是immutablemutable我在講清楚一點好了 mutable代表物件本身可以擴增所以在你的例子裡_List它本身可以擴增,但如果你把_List.append('a')改成 _List=['b']那麼,_List就會指向['b']外面傳進來的list物件此時不會受到影響這個樣的情況就會跟你func2的例子一樣,func2裡面的_int會指向新的結果物件。

Links booklink

Contact Us: admin [ a t ] ucptt.com