# list deepcopy - 在Python中深層複製列表

## file dict (7)

``````def get_graph():
f=open('kargerMinCut.txt')
G={}
for line in f:
ints = [int(x) for x in line.split()]
G[ints[0]]=ints[1:len(ints)]
return G

def get_edge(G):
E=[]
for i in range(1,201):
for v in G[i]:
if v>i:
E.append([i,v])
print id(E)
return E

def karger(E):
import random
count=200
while 1:
if count == 2:
break
edge = random.randint(0,len(E)-1)
v0=E[edge][0]
v1=E[edge][1]
E.pop(edge)
if v0 != v1:
count -= 1
i=0
while 1:
if i == len(E):
break
if E[i][0] == v1:
E[i][0] = v0
if E[i][1] == v1:
E[i][1] = v0
if E[i][0] == E[i][1]:
E.pop(i)
i-=1
i+=1

mincut=len(E)
return mincut

if __name__=="__main__":
import copy
G = get_graph()
results=[]
E0 = get_edge(G)
print E0[1:10]               ## this result is not equal to print2
for k in range(1,5):
E0_copy=list(E0)         ## I guess here E0_coypy is a deep copy of E0
results.append(karger(E0_copy))
#print "the result is %d" %min(results)
print E0[1:10]               ## this is print2
``````

`E0_copy`不是深層副本。 您不使用`list()`創建深層副本（ `list(...)``testList[:]`都是淺層副本）。

``````deepcopy(x, memo=None, _nil=[])
Deep copy operation on arbitrary Python objects.
``````

``````>>> a = [[1, 2, 3], [4, 5, 6]]
>>> b = list(a)
>>> a
[[1, 2, 3], [4, 5, 6]]
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> a[0][1] = 10
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b   # b changes too -> Not a deepcopy.
[[1, 10, 3], [4, 5, 6]]
``````

``````>>> import copy
>>> b = copy.deepcopy(a)
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b
[[1, 10, 3], [4, 5, 6]]
>>> a[0][1] = 9
>>> a
[[1, 9, 3], [4, 5, 6]]
>>> b    # b doesn't change -> Deep Copy
[[1, 10, 3], [4, 5, 6]]
``````

``````def deep_copy(x):
if not isinstance(x, list): return x
else: return map(deep_copy, x)
``````

``````my_list = [0, 1, 2, 3, 4, 5]  # some list
my_list_copy = list(my_list)  # my_list_copy and my_list does not share reference now.
``````

``````import copy
copy.copy()
copy.deepcopy()
``````

copy（）是一個淺複製函數，如果給定的參數是一個複合數據結構，例如一個列表 ，那麼python將創建另一個相同類型的對象（在本例中是一個新列表 ），但對於舊列表中的所有內容，只複製他們的參考

``````# think of it like
newList = [elem for elem in oldlist]
``````

deepcopy（）實際上保留了原始復合數據的圖形結構：

``````a = [1,2]
b = [a,a] # there's only 1 object a
c = deepcopy(b)

# check the result
c[0] is a # return False, a new object a' is created
c[0] is c[1] # return True, c is [a',a'] not [a',a'']
``````

``````new_list = [i for i in old_list]
``````

``````new_grid = [[i for i in row] for row in grid]
``````

``````a = [0,1,2,3,4,5,6,7,8,9,10]
b = a[:] #deep copying the list a and assigning it to b
print id(a)
20983280
print id(b)
12967208

a[2] = 20
print a
[0, 1, 20, 3, 4, 5, 6, 7, 8, 9,10]
print b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10]
``````

Python不會將值存儲在變量中; 它將名稱綁定到對象。 您的原始任務使用了`my_list`引用的對象，並將其綁定到`new_list` 。 無論使用哪個名稱，仍然只有一個列表，因此將其引用為`my_list`時所做的更改將在以`new_list`引用時`new_list` 。 此問題的其他每個答案都為您提供了創建綁定到`new_list`的新對象的不同方法。

``````new_list = list(my_list)  # or my_list[:], but I prefer this syntax
# is simply a shorter way of:
new_list = [element for element in my_list]
``````

``````import copy
# each element must have __copy__ defined for this...
new_list = [copy.copy(element) for element in my_list]
``````

``````import copy
# each element must have __deepcopy__ defined for this...
new_list = copy.deepcopy(my_list)
``````