1. 程式人生 > >淺析Python中深拷貝和淺拷貝

淺析Python中深拷貝和淺拷貝

int lis end 四種 都是 變量 內存空間 string --

按照以下不同情況,在IDE中逐個解除註釋,就明白了


import copy

"""
第一種情況,不可變類型變量,都是引用
"""
# a = 1
# a = (11, 222, 333)
# a = ‘string‘
# a = True
# b = a
#
# print(id(a))
# print(id(b))
#
# c =copy.copy(a)
# d = copy.deepcopy(a)
# print(id(c))
# print(id(d))

"""
第二種情況,可變類型變量,淺拷貝和深拷貝都開辟了空間
備註:[(1,2),3]外層可變,內層不可變,同此類型。
"""
# a = [2, 3, 4]
# # a = {2,5,6}
# # a = {"name": "jim"}
# b = a
# c =copy.copy(a)
# d = copy.deepcopy(a)
#
# print(id(a))
# print(id(b))
# print(id(c))
# print(id(d))
#
# # ................
# a.append(5)
# # ----------------
#
# print(a)
# print(b)
# print(c)
# print(d)

"""
第三種情況,內外層都是不可變類型的,深淺拷貝都是引用
"""
# a = ((1,2),)
# b = a
# c =copy.copy(a)
# d = copy.deepcopy(a)
#
# print(id(a))
# print(id(b))
# print(id(c))
# print(id(d))
#
#
# print(a)
# print(b)
# print(c)
# print(d)

"""
第四種情況,外層不可變,內層可變,因為淺拷貝對不可變類型只是指向了,也即引用了內存地址,深拷貝重新開辟了內存地址。
"""
# e = 1
# f = 2
# list1 = [e, f]
# a = (list1,) # a= ([1,2],)
# b = a
#
# print(id(a))
# print(id(b))
#
# c =copy.copy(a)
# d = copy.deepcopy(a)
# print(id(c))
# print(id(d))
#
# list1.append(8)
#
# print(id(a))
# print(id(b))
# print(id(c))
# print(id(d))
# print(a)
# print(b)
# print(c)
# print(d)

"""
第五種情況,外層可變,內層可變----真正體現淺拷貝和深拷貝的差距,a[:]是一種淺拷貝。深淺拷貝都重新開辟了內存空間,淺拷貝的內層元素只是引用了內存地址,深拷貝的內層元素也重新開辟了內存空間。

"""
e = 1
f = 2
list1= [e,f]

g = 3
h = 4
list2 = [g,h]

a = [list1,list2]
b = a
c =copy.copy(a)
d = copy.deepcopy(a)

print(id(a))
print(id(b))
print(id(c))
print(id(d))

print(a)
print(b)
print(c)
print(d)

print("*" * 20)

# 改變e或者f的元素

list1.append(‘list1‘)

print(id(a))
print(id(b))
print(id(c))
print(id(d))

print(a)
print(b)
print(c)
print(d)

print("*" * 20)
a.append(‘a‘)

print(id(a))
print(id(b))
print(id(c))
print(id(d))

print(a)
print(b)
print(c)
print(d)

淺析Python中深拷貝和淺拷貝