天天看點

python中list清單複制的幾種方法。

轉自:微點閱讀   https://www.weidianyuedu.com

1、淺拷貝和深拷貝

淺拷貝複制指向某個對象的位址(指針),而不複制對象本身,新對象和原對象共享同一記憶體。

深拷貝會額外建立一個新的對象,新對象跟原對象并不共享記憶體,修改新對象不會影響到原對象。

指派其實就是引用了原對象。兩者指向同一記憶體,兩個對象是關聯的,無論哪個對象發生改變都會影響到另一個。

2、直接指派

使用=來複制一個清單,實際上不僅複制了其中的内容,也複制了其記憶體位址,即引用了原清單。使用id()方法檢視記憶體位址也是一樣的。修改其中一個清單,也會直接更改另一個清單。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#!/usr/bin/env python

# -*- coding:utf-8 -*-

if

__name__

=

=

'__main__'

:

a

=

[

"a"

, [

"b"

,

"c"

,

"d"

], [

"e"

,

"f"

]]

# 直接複制,即引用清單

b

=

a

print

(a)

print

(b)

# 通過id()檢視記憶體位址,為一樣的

print

(

id

(a),

id

(b))

b[

]

=

"g"

b[

1

][

]

=

"f"

print

(a)

print

(b)

輸出:

['a', ['b', 'c', 'd'], ['e', 'f']]

['a', ['b', 'c', 'd'], ['e', 'f']]

2030264836936 2030264836936

['g', ['f', 'c', 'd'], ['e', 'f']]

['g', ['f', 'c', 'd'], ['e', 'f']]

Process finished with exit code 0

3、for循環

使用for循環進行拷貝,僅第一層為深拷貝,對其它層依然是淺拷貝。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#!/usr/bin/env python

# -*- coding:utf-8 -*-

if

__name__

=

=

'__main__'

:

a

=

[

"a"

, [

"b"

,

"c"

,

"d"

], [

"e"

,

"f"

]]

b

=

[]

# 使用for循環進行拷貝,僅第一層為深拷貝

for

i

in

a:

b.append(i)

print

(a)

print

(b)

b[

]

=

"g"

b[

1

][

]

=

"f"

print

(a)

print

(b)

輸出:

['a', ['b', 'c', 'd'], ['e', 'f']]

['a', ['b', 'c', 'd'], ['e', 'f']]

['a', ['f', 'c', 'd'], ['e', 'f']]

['g', ['f', 'c', 'd'], ['e', 'f']]

Process finished with exit code 0

4、切片

使用切片方法進行拷貝,也僅對第一層為深拷貝,對其它層依然是淺拷貝。

1

2

3

4

5

6

7

8

9

10

11

12

#!/usr/bin/env python

# -*- coding:utf-8 -*-

if

__name__

=

=

'__main__'

:

a

=

[

"a"

, [

"b"

,

"c"

,

"d"

], [

"e"

,

"f"

]]

# 使用切片進行拷貝,僅第一層為深拷貝

b

=

a[:]

print

(a)

print

(b)

b[

]

=

"g"

b[

1

][

]

=

"f"

print

(a)

print

(b)

輸出:

['a', ['b', 'c', 'd'], ['e', 'f']]

['a', ['b', 'c', 'd'], ['e', 'f']]

['a', ['f', 'c', 'd'], ['e', 'f']]

['g', ['f', 'c', 'd'], ['e', 'f']]

Process finished with exit code 0

5、copy()方法

(1)list.copy()方法

使用list.copy()方法進行拷貝,也僅對第一層為深拷貝,對其它層依然是淺拷貝。由于清單中嵌套的清單實際儲存的是位址,依然指向同一個記憶體位址。

1

2

3

4

5

6

7

8

9

10

11

12

13

#!/usr/bin/env python

# -*- coding:utf-8 -*-

if

__name__

=

=

'__main__'

:

a

=

[

"a"

, [

"b"

,

"c"

,

"d"

], [

"e"

,

"f"

]]

# 使用list.copy()方法進行拷貝,僅第一層為深拷貝

b

=

a.copy()

print

(a)

print

(b)

b[

]

=

"g"

b[

1

][

]

=

"f"

print

(a)

print

(b)

輸出:

['a', ['b', 'c', 'd'], ['e', 'f']]

['a', ['b', 'c', 'd'], ['e', 'f']]

['a', ['f', 'c', 'd'], ['e', 'f']]

['g', ['f', 'c', 'd'], ['e', 'f']]

Process finished with exit code 0

(2)copy.copy()方法

使用copy.copy()方法進行拷貝,也僅對第一層為深拷貝,對其它層依然是淺拷貝。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import

copy

if

__name__

=

=

'__main__'

:

a

=

[

"a"

, [

"b"

,

"c"

,

"d"

], [

"e"

,

"f"

]]

# 使用copy.copy()方法進行拷貝,僅第一層為深拷貝

b

=

copy.copy(a)

print

(a)

print

(b)

b[

]

=

"g"

b[

1

][

]

=

"f"

print

(a)

print

(b)

輸出:

['a', ['b', 'c', 'd'], ['e', 'f']]

['a', ['b', 'c', 'd'], ['e', 'f']]

['a', ['f', 'c', 'd'], ['e', 'f']]

['g', ['f', 'c', 'd'], ['e', 'f']]

Process finished with exit code 0

6、deepcopy()方法

使用copy.deepcopy()方法進行拷貝,對所有層均為深拷貝,改變新清單并不會影響到原清單,推薦使用。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import

copy

if

__name__

=

=

'__main__'

:

a

=

[

"a"

, [

"b"

,

"c"

,

"d"

], [

"e"

,

"f"

]]

# 使用copy.deepcopy()方法進行拷貝,對所有層均為深拷貝

b

=

copy.deepcopy(a)

print

(a)

print

(b)

b[

]

=

"g"

b[

1

][

]

=

"f"

print

(a)

print

(b)

輸出:

['a', ['b', 'c', 'd'], ['e', 'f']]

['a', ['b', 'c', 'd'], ['e', 'f']]

['a', ['b', 'c', 'd'], ['e', 'f']]

['g', ['f', 'c', 'd'], ['e', 'f']]

Process finished with exit code 0

到此這篇關于python中list清單複制的幾種方法(指派、切片、copy(),deepcopy())的文章就介紹到這了。