1,先看賦值運算。python
l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['barry', 'alex']] print(l2) # [111, 2, 3, ['barry', 'alex']] l1[3][0] = 'wusir' print(l1) # [111, 2, 3, ['wusir', 'alex']] print(l2) # [111, 2, 3, ['wusir', 'alex']]
對於賦值運算來講,l1與l2指向的是同一個內存地址,因此他們是徹底同樣的。app
2,淺拷貝copy。優化
#同一代碼塊下: l1 = [1, '太白', True, (1,2,3), [22, 33]] l2 = l1.copy() print(id(l1), id(l2)) # 2713214468360 2713214524680 print(id(l1[-2]), id(l2[-2])) # 2547618888008 2547618888008 print(id(l1[-1]),id(l2[-1])) # 2547620322952 2547620322952 # 不一樣代碼塊下: >>> l1 = [1, '太白', True, (1, 2, 3), [22, 33]] >>> l2 = l1.copy() >>> print(id(l1), id(l2)) 1477183162120 1477183162696 >>> print(id(l1[-2]), id(l2[-2])) 1477181814032 1477181814032 >>> print(id(l1[-1]), id(l2[-1])) 1477183162504 1477183162504
對於淺copy來講,只是在內存中從新建立了開闢了一個空間存放一個新列表,可是新列表中的元素與原列表中的元素是公用的。spa
3,深拷貝deepcopy。code
# 同一代碼塊下 import copy l1 = [1, 'alex', True, (1,2,3), [22, 33]] l2 = copy.deepcopy(l1) print(id(l1), id(l2)) # 2788324482440 2788324483016 print(id(l1[0]),id(l2[0])) # 1470562768 1470562768 print(id(l1[-1]),id(l2[-1])) # 2788324482632 2788324482696 print(id(l1[-2]),id(l2[-2])) # 2788323047752 2788323047752 # 不一樣代碼塊下 >>> import copy >>> l1 = [1, '太白', True, (1, 2, 3), [22, 33]] >>> l2 = copy.deepcopy(l1) >>> print(id(l1), id(l2)) 1477183162824 1477183162632 >>> print(id(0), id(0)) 1470562736 1470562736 >>> print(id(-2), id(-2)) 1470562672 1470562672 >>> print(id(l1[-1]), id(l2[-1])) 1477183162120 1477183162312
對於深copy來講,列表是在內存中從新建立的,列表中可變的數據類型是從新建立的,列表中的不可變的數據類型是公用的。blog
1、數字和字符串內存
對於 數字 和 字符串 而言,賦值、淺拷貝和深拷貝無心義,由於其永遠指向同一個內存地址。ci
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import
copy
# ######### 數字、字符串 #########
n1
=
123
# n1 = "i am alex age 10"
print
(
id
(n1))
# ## 賦值 ##
n2
=
n1
print
(
id
(n2))
# ## 淺拷貝 ##
n2
=
copy.copy(n1)
print
(
id
(n2))
# ## 深拷貝 ##
n3
=
copy.deepcopy(n1)
print
(
id
(n3))
|
2、其餘基本數據類型字符串
對於字典、元祖、列表 而言,進行賦值、淺拷貝和深拷貝時,其內存地址的變化是不一樣的。string
一、賦值
賦值,只是建立一個變量,該變量指向原來內存地址,如:
1
2
3
|
n1
=
{
"k1"
:
"wu"
,
"k2"
:
123
,
"k3"
: [
"alex"
,
456
]}
n2
=
n1
|
二、淺拷貝
淺拷貝,在內存中只額外建立第一層數據
1
2
3
4
5
|
import
copy
n1
=
{
"k1"
:
"wu"
,
"k2"
:
123
,
"k3"
: [
"alex"
,
456
]}
n3
=
copy.copy(n1)
|
三、深拷貝
深拷貝,在內存中將全部的數據從新建立一份(排除最後一層,即:python內部對字符串和數字的優化)
1
2
3
4
5
|
import
copy
n1
=
{
"k1"
:
"wu"
,
"k2"
:
123
,
"k3"
: [
"alex"
,
456
]}
n4
=
copy.deepcopy(n1)
|
賦值運算:
l1 = [1,2,3] l2 = l1 l2.append(666) print(l1,l2) #[1, 2, 3, 666] [1, 2, 3, 666] 對於賦值運算來講,指向的都是同一個內存地址,一直都不變
淺copy:
l1 = [11,22,33] l2 = l1.copy() l1.append(666) print(l1,id(l1)) #[11, 22, 33, 666] 31203144 print(l2,id(l2)) #[11, 22, 33] 31203272 l1 = [11, 22, ['barry', [55, 66]], [11, 22]] l2 = l1.copy( ) l1[2].append('alex') #print(l1,id(l1)) #11, 22, ['barry', [55, 66], 'alex'], [11, 22]] 41723272 #print(l2,id(l2)) # [11, 22, ['barry', [55, 66], 'alex'], [11, 22]] 41723336 print(l1, id(l1[-1])) print(12, id (l2[-1])) #### 對於淺copy來講,第一層建立的是新的內存地址,而從第二層開始,指向的都是同一個內存地址,因此,對於第二層以及更深的層數來講,保持一致性。
深copy:徹底獨立 (複製其數據完徹底全放獨立的一個內存,徹底拷貝,數據不共享)
深copy:徹底獨立 import copy l1 = [11,22, ['barry']] l2 = copy.deepcopy(l1) l1[2].append('alex') print(l1,id(l1[-1])) # [11,22, ['barry' , 'alex' ]] 42282312 print(l2, id(l2[-1])) # [11,22, ['barry'] ] 42332680