Shen - 9 months ago 37

Python Question

I have some problem with a List copy:

So After I got

`E0`

`'get_edge'`

`E0`

`'E0_copy = list(E0)'`

`E0_copy`

`E0`

`E0_copy`

`'karger(E)'`

Why does the result of

`'print E0[1:10]'`

Below is my code:

`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

Thanks in advance!

Answer

`E0_copy`

is not a deep copy. You don't make a deep copy using `list()`

(Both `list(...)`

and `testList[:]`

are shallow copies).

You use `copy.deepcopy(...)`

for deep copying a list.

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

See the following snippet -

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

Now see the `deepcopy`

operation

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

Source (Stackoverflow)