作者ericrobin ()
看板Python
标题[问题] list与list[:]差异
时间Sun Aug 30 00:40:38 2020
以前都没注意到两者不太一样
直到我跑了下面这段码
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://webptt.com/cn.aspx?n=bbs/Python/M.1598719240.A.3A8.html
1F:推 TuCH: 是的 tmp只是指标 tmp[:] == tmp.copy() 08/30 02:11
2F:→ tsaiminghan: tmp[:]是浅复制(shallow copy) 08/30 22:34
3F:推 calvinvin: 没错,对变数赋值时其实是将变数指向某段记忆体位址, 08/31 10:07
4F:→ calvinvin: 例如a=[1,2,3], b=a, c=a的意思是创出一段值为[1,2,3] 08/31 10:07
5F:→ calvinvin: 的记忆体位置,然後将a指向它,b、c则跟a也一样指向它 08/31 10:07
6F:→ calvinvin: 。透过a、b、c任一个变数使用method来修改[1,2,3]时, 08/31 10:07
7F:→ calvinvin: 指向该处的a,b,c当然也就随之而变。而赋值为list[:]时 08/31 10:07
8F:→ calvinvin: 则是建立一个新的记忆体位址,其值为list[:],修改原 08/31 10:07
9F:→ calvinvin: 本的list当然就不会影响到这新的、独立的东西。 08/31 10:07
10F:→ calvinvin: 所以你的程式码将list[:]改成list後,跑的结果是将ans 08/31 10:10
11F:→ calvinvin: 一直append上tmp,而这个tmp指向的值则是你最後将tmp 08/31 10:10
12F:→ calvinvin: 给pop完的空list。 08/31 10:10
13F:推 calvinvin: 以上是我非本科系自学新手的理解,若有观念、名词错误 08/31 10:14
14F:→ calvinvin: 烦请大大不吝纠正,若是我自以为而没回答的原po的问题 08/31 10:14
15F:→ calvinvin: ,也先说抱歉@@ 08/31 10:14