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