python深浅拷贝
可变类型和不可变类型
不可变对象:一旦创建就不可修改的对象,包括字符串、元组、数值类型(整型、浮点型)
该对象所指向的内存中的值不能被改变。当改变某个变量的时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这回开辟一个新的地址,变量再指向这个新的地址
可变对象:可以修改的对象,包括列表、字典、集合
该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的地址,通俗点就是原地址改变
变量赋值执行原理
a = "python"
Python解释器干的事情:
- 创建变量a
- 创建一个对象(分配一块内存),来存储值"python"
- 将变量与对象,通过指针连接起来,从变量到对象的连接称之为引用(变量引用对象)
深浅拷贝总结
1.所谓的深浅拷贝分别指的是:
浅拷贝:copy模块的copy()
深拷贝:copy模块的deepcopy()
2.大白话解释深浅拷贝:
深拷贝拷贝的深,浅拷贝拷贝的浅
3.深浅拷贝主要是针对可变类型来讲,深拷贝拷贝所有层(可变),浅拷贝只拷贝第一层(拷贝)
如果针对不可变类型,则用法和普通赋值一样,并无区别
代码
"""
案例:深浅拷贝
记忆(总结):
1.所谓的深浅拷贝分别指的是:
浅拷贝:copy模块的copy()
深拷贝:copy模块的deepcopy()
2.大白话解释深浅拷贝:
深拷贝拷贝的深,浅拷贝拷贝的浅
3.深浅拷贝主要是针对可变类型来讲,深拷贝拷贝所有层(可变),浅拷贝只拷贝第一层(拷贝)
如果针对不可变类型,则用法和普通赋值一样,并无区别
"""
import copy
def demo1_普通赋值():
a = 10
b = a
print('id( a)->', id(a))
print('id( b)->', id(b))
print('id(10)->', id(10))
a = [1, 2, 3]
b = [11, 22, 33]
c = [a, b]
d = c
print('id( c)->', id(c))
print('id( d)->', id(d))
def demo2_浅拷贝可变类型():
a = [1, 2, 3]
b = [11, 22, 33]
c = [6, 7, a, b]
d = copy.copy(c)
print('id( c)->', id(c))
print('id( d)->', id(d))
print(id(c[2]))
print(id(a))
a[2] = 22
print('c->', c)
print('d->', d)
def demo3_浅拷贝不可变类型():
a = (1, 2, 3)
b = (11, 22, 33)
c = (6, 7, a, b)
d = copy.copy(c)
print('id( c)->', id(c))
print('id( d)->', id(d))
def demo4_深拷贝可变类型():
a = [1, 2, 3]
b = [11, 22, 33]
c = [6, 7, a, b]
d = copy.deepcopy(c)
print('id( c)->', id(c))
print('id( d)->', id(d))
print(id(c[2]))
print(id(a))
a[2] = 22
print('c->', c)
print('d->', d)
def demo5_深拷贝不可变类型():
a = (1, 2, 3)
b = (11, 22, 33)
c = (6, 7, a, b)
d = copy.deepcopy(c)
print('id( c)->', id(c))
print('id( d)->', id(d))
def demo6():
a = [1, 2, 3]
b = (11, 22, 33)
c = (6, 7, a, b)
d = copy.deepcopy(c)
c[2][0] = 2
print('id( c)->', id(c))
print('id( d)->', id(d))
print(c)
print(d)
print(id(c[2]))
print(id(d[2]))
print(id(c[3]))
print(id(d[3]))
if __name__ == "__main__":
# demo1_普通赋值()
# demo2_浅拷贝可变类型()
# demo3_浅拷贝不可变类型()
# demo4_深拷贝可变类型()
# demo5_深拷贝不可变类型()
demo6()
图解





浙公网安备 33010602011771号