Python动态类型实现原理及过程解析

网友投稿 262 2022-11-24


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)# 3

a = 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模块

import copy

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]]

浅拷贝中可变对象中嵌套的可变对象的引用还是原来的引用。

深拷贝可以拷贝嵌套的对象结构。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:maven继承父工程统一版本号的实现
下一篇:IntelliJ IDEA(2020.2)的下载、安装步骤详细教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~