Python-如何深层复制列表?

我对列表副本有一些问题:

所以之后我得到了E0来自'get_edge',我做的副本E0通过调用'E0_copy = list(E0)'。我猜这里E0_copy是的较深的副本E0,我通过E0_copy了'karger(E)'。但是在主要功能上。

为什么'print E0[1:10]'for循环之前的结果与for循环之后的结果不同?

下面是我的代码:

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[:]很浅拷贝)。

copy.deepcopy(...)用于深度复制列表。

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]]

现在看deepcopy操作

>>> 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]]

以上是 Python-如何深层复制列表? 的全部内容, 来源链接: utcz.com/qa/421536.html

回到顶部