python浅拷贝与深拷贝

       最近看了一些Python的教学视频,其中看到一个关于Python拷贝(浅拷贝与深拷贝)的知识点,老师说这是重点,所以在这里分享一下我对浅拷贝与深拷贝的理解。

       Python的拷贝方式分为两种,一种是浅拷贝,另一种是深拷贝,所谓浅拷贝,通俗点说就是把一个变量的值赋给另一个变量,Python对变量赋值的处理方式和C、C++不同,对于某个赋值语句如a=100,C、C++是开辟一块空间,这个空间的名字是a,然后把100放入a所在的空间,如果变量的值改变,那么a的地址不变,变化的只是a所在地址里的值,而Python是开辟一块空间,名字是整数100,然后变量a指向100,如果a的值改变,比如改成a=200,那么100的地址不变,另外开辟一块名字为200的空间,让a指向他,本人语文不好,说的可能有点迷,大家看下面的代码会直观一点:

python:

a = 100
print(id(a))
a = 200
print(id(a))

执行结果为:

1574664352

1574667552

C++:

int a;
a = 100;
cout<<&a<

执行结果为:

0x6dfefc
0x6dfefc

因为Python有这样的特点,造成Python的拷贝方式被分为浅拷贝和深拷贝。

浅拷贝,简单点就是变量之间相互赋值,如下:

a = [11,22,33]
b = a
print(id(a))
print(id(b))

执行结果为:

1574664352

1574664352

可以看到,两个变量共用一块内存地址,图示如下:

python浅拷贝与深拷贝_第1张图片

浅拷贝还可以通过copy库中的copy函数来进行,代码如下:

import copy
a = 100
c = copy.copy(a)
print(id(a))
print(id(c))

 执行结果为:

1574664352

1574664352

所谓深拷贝,就是另外开辟一块空间,将被拷贝变量的值放进去,然后让新变量指向新开辟的内存空间,深拷贝用copy库中的deepcopy函数实现,代码如下:

import copy

a = [11,22,33]
b = copy.deepcopy(a)
print(id(a))
print(b)
print(id(b))

执行结果为:

2400936241032

[11, 22, 33]

2400936240968

可以发现地址已经被改变。

图示如下:

python浅拷贝与深拷贝_第2张图片

这里要说一个注意的问题,深拷贝的作用对象只能是Python当中的可变数据类型,如列表和字典,对于不可变数据类型如元组tuple和数值型来说是没有用的,我举个例子大家就明白了:

import copy

a = 100
b = (11,22,33)
c = copy.deepcopy(a)
d = copy.deepcopy(b)

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

执行结果为:

1574664352

1574664352

2400936875928

2400936875928

可以发现地址并没有被改变。

以上只是对深拷贝和浅拷贝的一个很浅的理解,大佬勿喷。

如果有写的不对的地方还请各位大佬批评指正。

你可能感兴趣的:(学习笔记,Python,深拷贝与浅拷贝)