python is和==区别 深拷贝和浅拷贝

请简述赋值, 深拷贝和浅拷贝的区别?(python中如何拷贝一个对象?)

- 直接赋值(li1 = li): 只传递对象的引用, li1指向对象li的内存地址空间,
    因此, 原有列表li改变, 被赋值的li1也会做相应的改变.

- 浅拷贝(三种实现方式 eg: li2=li.copy()):li和li2的内存地址不同,
    但是子对象的内存地址相同, 因此,原始数据改变 , 子对象也改变.

- 深拷贝(import copy, eg: li3=copy.deepcopy(li)), li和li3的内存地址不同,
         包含子对象的拷贝, 所以原始对象改变并不会造成深拷贝里面任何子项的改变.

*** 当深拷贝和浅拷贝, 针对的对象全部是不可变数据类型时, 两者效果相同;
*** 当深拷贝和浅拷贝, 针对的对象包含是可变数据类型时, 两者才有上述区别;
li = [1,2,3]
li1 = li
li.append(4)
li
[1, 2, 3, 4]
li1
[1, 2, 3, 4]
li2 = li[:]
li3 = li.copy()
li
[1, 2, 3, 4]
li.append(5)
li
[1, 2, 3, 4, 5]
li1
[1, 2, 3, 4, 5]
li2
[1, 2, 3, 4]
li3
[1, 2, 3, 4]
"""

# 列表里面嵌套列表

"""
li = [['a', 'b'], 2, 3, 4]
li2 = li[:]
li3 = li.copy()
id(li), id(li1), id(li2)
(140198666531528, 140198653810888, 140198653810824)
id(li), id(li1), id(li2), id(li3)
(140198666531528, 140198653810888, 140198653810824, 140198653949512)
li.append(5)
li, li2, li3
([['a', 'b'], 2, 3, 4, 5], [['a', 'b'], 2, 3, 4], [['a', 'b'], 2, 3, 4])
li[0].append('c')
li, li2, li3
([['a', 'b', 'c'], 2, 3, 4, 5], [['a', 'b', 'c'], 2, 3, 4], [['a', 'b', 'c'], 2, 3, 4])


li = [['a', 'b'], 1,2]
li2 = li.copy()
li
[['a', 'b'], 1, 2]
li2
[['a', 'b'], 1, 2]
id(li[0])
140198666473736
id(li2[0])
140198666473736

import copy
li
[['a', 'b'], 1, 2]
li2
[['a', 'b'], 1, 2]
li3 = copy.copy(li)
li4 = copy.deepcopy(li)
li
[['a', 'b'], 1, 2]
li4
[['a', 'b'], 1, 2]
id(li[0])
140198666473736
id(li4[0])
140198658766920

"""
# 所有的数值类型和布尔类型, str是不可变数据类型,
# list是可变数据类型;
# 浅拷贝的实现:
#   - li.copy()
#   - li[:]
#   - copy.copy(li)

# 实现深拷贝:
#   - copy.deepcopy(li)

猜你喜欢

转载自blog.csdn.net/zcx1203/article/details/81697775