Python动态类型实现原理及过程解析
在python中,我们使用变量时,并没有声明变量的存在和类型。类型是在运行过程中自动决定的。
a=3
python将会执行三步去完成上面这个请求。
1.创建一个对象代表3
2.创建一个变量a,如果a未创建。
3.将变量a与对象3相连接。
可以将变量a看作对象3的一个引用。
a=3
b=a
多个变量可以指向同一个对象,在Python中叫共享引用。
Python在每个对象中保持了一个计数器,用于记录当前指向该对象的引用的数目,一旦计数器被设置为0,该对象的内存空间就会自动回收。
原处修改对象
由于共享引用的存在,有一些对象和操作会在原处修改对象。
Python中对象可分为可变类型对象和不可变类型对象。
可变对象:列表,字典
不可变对象:数字,字符串,元组
如果变量是不可变对象的引用,对变量名的修改不会影响其他变量,而是直接连接到修改的对象。
a=3
b=a
print(a)#3
print(b)#3a=4
print(a)#4
print(b)#3
如果变量是可变对象的引用,对变量名的修改会影响其他变量。
a=[1,2,3]
b=a
print(a)#[1,2,3]
print(b)#[1,2,3]a[0]=4
print(a)#[4,2,3]
print(b)#[4,2,3]
拷贝
所以当你需要创建一个与原列表一样同时又独立于原列表的列表时,可以使用拷贝。
下面介绍最常用的两种。
a=[1,2,3]
b=a[:]
print(a)#[1,2,3]
print(b)#[1,2,3]a[0]=4
print(a)#[4,2,3]
print(b)#[1,2,3]
此时b引用的是a所引用的对象的拷贝。a,b指向不同的内存区域。
在字典和集合中,无法使用这种方法。
可以使用标准库中的copy模块
importcopy
a=[1,2,[3]]
b=copy.copy(a)#浅拷贝
c=copy.deepcopy(a)#深拷贝a[0]=0
a[-1].append(4)print(a)#[0,2,[3,4]]
print(b)#[1,2,[3,4]]
print(c)#[1,2,[3]]
浅拷贝中可变对象中嵌套的可变对象的引用还是原来的引用。
深拷贝可以拷贝嵌套的对象结构。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。