看板 Python 關於我們 聯絡資訊
以前都沒注意到兩者不太一樣 直到我跑了下面這段碼 def subsets(self, nums): def backtrack(start, end, tmp): ans.append(tmp[:]) for i in range(start, end): tmp.append(nums[i]) backtrack(i+1, end, tmp) tmp.pop() ans = [] backtrack(0, len(nums), []) return ans 假如nums=[1,2,3] 照這段碼跑下去, tmp能夠隨著函數的呼叫持續變動, 最後ans 會返回1,2,3 [[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]] 然而如果第三行的tmp[:]改為tmp 最後只會是[[],[],[],[],[],[],[],[]] 不知道兩者間的差別在哪 而這差別除了在函數呼叫有影響外, 還有什麼時候要注意呢 以往沒特別打上[:]好像都沒出過事@@ 用type看了一下都是<class 'list'> 我猜會不會tmp只是類似這list開頭的指標 而tmp[:]才是整段list的值? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 12.185.151.146 (美國) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1598719240.A.3A8.html
TuCH: 是的 tmp只是指標 tmp[:] == tmp.copy() 08/30 02:11
tsaiminghan: tmp[:]是淺複製(shallow copy) 08/30 22:34
calvinvin: 沒錯,對變數賦值時其實是將變數指向某段記憶體位址, 08/31 10:07
calvinvin: 例如a=[1,2,3], b=a, c=a的意思是創出一段值為[1,2,3] 08/31 10:07
calvinvin: 的記憶體位置,然後將a指向它,b、c則跟a也一樣指向它 08/31 10:07
calvinvin: 。透過a、b、c任一個變數使用method來修改[1,2,3]時, 08/31 10:07
calvinvin: 指向該處的a,b,c當然也就隨之而變。而賦值為list[:]時 08/31 10:07
calvinvin: 則是建立一個新的記憶體位址,其值為list[:],修改原 08/31 10:07
calvinvin: 本的list當然就不會影響到這新的、獨立的東西。 08/31 10:07
calvinvin: 所以你的程式碼將list[:]改成list後,跑的結果是將ans 08/31 10:10
calvinvin: 一直append上tmp,而這個tmp指向的值則是你最後將tmp 08/31 10:10
calvinvin: 給pop完的空list。 08/31 10:10
calvinvin: 以上是我非本科系自學新手的理解,若有觀念、名詞錯誤 08/31 10:14
calvinvin: 煩請大大不吝糾正,若是我自以為而沒回答的原po的問題 08/31 10:14
calvinvin: ,也先說抱歉@@ 08/31 10:14