我知道發送列表時,作爲參數傳遞給函數,函數的變化將改變列表,例如:改變,因爲函數參數列表的價值
p=[[3, 4], [2, 3]]
node=[5,3]
def foo(node, p_as_list):
p_as_list.append(node)
foo(node, p)
print(p) #p changes
阻止我用拷貝的變化( ):
p=[[3, 4], [2, 3]]
node=[5,3]
def foo(node, p_as_list):
p_as_list.append(node)
#this line
foo(node, p.copy())
print(p) # without changes
,但如果我改變函數是這樣的:
p=[[3, 4], [2, 3]]
node=[5,3]
def foo(node, p_as_list):
#this line
p_as_list=p_as_list[-1]
p_as_list.append(node)
foo(node, p.copy())
print(p)
則p將再次改變,我無法理解爲什麼會發生?要做到這一點
這是因爲你做的,而不是一深一淺拷貝。您正在複製對那些仍在修改的內部列表的引用。請參閱[深拷貝和淺拷貝之間的區別是什麼?](http://stackoverflow.com/questions/184710/what-is-the-difference-between-a-deep-copy-and-a-shallow - 複製) – SuperBiasedMan
我需要一個有效的內存方式來傳遞列表功能,我需要的列表不會改變,有沒有更好的解決方案? –
我不確定你的具體情況,但你可以嘗試複製被修改列表的部分。例如,如果您已經完成了'p_as_list = p_as_list [-1] .copy()',原始列表將保持不變,並且不會浪費存儲器複製原始列表的每個方面。你甚至可以刪除傳遞給函數的'p.copy()'部分。 – SuperBiasedMan