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

 更新时间:2020年08月31日 14:34:03   作者:五月的白色铃兰  
这篇文章主要介绍了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]]

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java Maven Settings配置参考教程

    Java Maven Settings配置参考教程

    这篇文章主要介绍了Java Maven Settings配置参考,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • bool当成函数参数错误理解

    bool当成函数参数错误理解

    经常会在函数的参数里使用bool参数,这会大大地降低代码的可读性
    2012-11-11
  • Java 数据结构与算法系列精讲之二叉堆

    Java 数据结构与算法系列精讲之二叉堆

    二叉堆是一种特殊的堆,其实质是完全二叉树。二叉堆有两种:最大堆和最小堆。最大堆是指父节点键值总是大于或等于任何一个子节点的键值。而最小堆恰恰相反,指的是父节点键值总是小于任何一个子节点的键值
    2022-02-02
  • struts2如何使用拦截器进行用户权限控制实例

    struts2如何使用拦截器进行用户权限控制实例

    本篇文章主要介绍了struts2如何使用拦截器进行用户权限控制实例,非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • java的MybatisPlus调用储存过程的返回数据问题

    java的MybatisPlus调用储存过程的返回数据问题

    这篇文章主要介绍了java的MybatisPlus调用储存过程的返回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java之assert关键字用法案例详解

    java之assert关键字用法案例详解

    这篇文章主要介绍了java之assert关键字用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Jmeter对接口测试入参实现MD5加密

    Jmeter对接口测试入参实现MD5加密

    这篇文章主要介绍了Jmeter对接口测试入参实现MD5加密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringMVC中请求参数的获取方式

    SpringMVC中请求参数的获取方式

    这篇文章主要为大家介绍了SpringMVC中请求参数的获取方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • java jvm的知识详细介绍

    java jvm的知识详细介绍

    这篇文章主要介绍了java jvm的知识详细介绍的相关资料,这里对java jvm中的堆内存和栈内存等基础知识做了详细介绍,需要的朋友可以参考下
    2016-11-11
  • java面试应用上线后Cpu使用率飙升如何排查

    java面试应用上线后Cpu使用率飙升如何排查

    这篇文章主要为大家介绍了java面试中应用上线后Cpu使用率飙升如何排查的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论