[問題] append(element+[])

作者: typhoonss821 (jeff)   2018-07-05 10:33:29
大家好
最近在刷leetcode 寫到一題給出一組數列 求所有permutations的可能
https://leetcode.com/problems/permutations/description/
我的code是這樣的,主體無窮遞迴的方式求解
class Solution:
def getSolution(self, x):
cach = []
result = []
self.permutations(x, cach, result)
return result
def permutations(self, x, cach, result):
if len(x) == 0:
result.append(cach)
for i in range(len(x)):
cach.append(x[i])
self.permutations(x[:i]+x[i+1:], cach, result)
cach.pop()
但我發現在上色部分append完的result在下一次append前他的值都會自動被改變
而我google了使用一樣解法的code,發現只要將append(cach)改成append(cach+[])
這樣的輸出就不會有值被改變的問題
我查了半天找不到類似的解釋 不太知道+[]的用意是什麼
所以來這邊請教大家
先謝謝大家的回答了!
作者: pmove (金疾檸檬)   2018-07-05 12:52:00
原來+[]是這個意思,之前比較常見的是cach[:]
作者: handsomeLin (DoGLin)   2018-07-05 23:02:00
因為你塞同一個reference進去 在result裡的結果會都一樣 相當於copy沒錯
作者: typhoonss821 (jeff)   2018-07-05 12:31:00
非常感謝兩位的回答
作者: Yshuan (倚絃)   2018-07-05 11:23:00
是function的mutable arguments特性 建議避免必須用的話, 最安全就是caller或callee去做copy
作者: mikapauli (桜花)   2018-07-05 10:41:00
複製的意思,或是用cach.copy()、cach[:]、list(cach)、tuple(cach)等都可以。
作者: typhoonss821 (jeff)   2018-07-05 10:51:00
請問是因為list的mutable性質所以改變cach也會改變之前的result.append嗎?

Links booklink

Contact Us: admin [ a t ] ucptt.com