[博学谷学习记录]超强总结,用心分享|人工智能python基础知识浅拷贝总结分享

 想要弄懂深浅拷贝的知识,首先要了解下面几个基础概念:

  • 变量:是一个系统表的元素,拥有指向对象的连接空间

  • 对象:被分配的一块内存,存储其所代表的值

  • 引用:是自动形成的从变量到对象的指针

  • 类型:属于对象,而非变量

  • 不可变对象:一旦创建就不可修改的对象,包括数值类型、字符串、布尔类型、元组

(该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。)

  • 可变对象:可以修改的对象,包括列表、字典、集合

(该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的地址,通俗点说就是原地改变。)

普通赋值

[博学谷学习记录]超强总结,用心分享|人工智能python基础知识浅拷贝总结分享_第1张图片

 普通的赋值只是复制了新对象的引用,并不会开辟新的内存空间,只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。

例如:

a=[1,2,3]
print(id(a)) # a的内存地址
b=a
a.append(4) # 修改a列表的值
print(id(b)) # b的内存地址
print(b)

打印出来的结果一模一样,由此可知普通的赋值只是复制了新对象的引用,并不会开辟新的内存空间,而且单独修改a还会影响b。

[博学谷学习记录]超强总结,用心分享|人工智能python基础知识浅拷贝总结分享_第2张图片

 

 

如果想让两个变量的值完全分开,不会相互影响的话就得用到浅拷贝,浅拷贝的用法如下所示:

import copy
a=[1,2,3]
print(id(a)) # a的内存地址
b=copy.copy(a)  # b对a进行浅拷贝
a.append(4)    # 修改a列表的值
print(id(b))    # b的内存地址
print(b)

从输出结果可以知道,用了浅拷贝之后,a和b的值和内存空间都是相互独立的,修改一个并不会影响另外一个,但是浅拷贝只能拷贝外层的对象,内层的还是复制新对象的引用,并不会开辟新的内存空间。例如:

import copy
a=[1,2,3,[4,5]]
print(id(a))    # a的内存地址
b=copy.copy(a)  # b对a的浅拷贝 
a[3].append(6)  # 修改内层的值
print(id(b))    # b的内存地址
print(b)
print(id(a[3]))    # a内层数据的内存地址
print(id(b[3]))    # b内层数据的内存地址

从打印结果上可以得知,浅拷贝并不会赋值内层对象的值,而是对内层对象的应用,并不会开辟新的内层空间。

你可能感兴趣的:(python)