Python对象内存地址

Python对象内存地址nbsp nbsp 在 python 中 万物皆对象 常见的整数 浮点数 字符串 元祖 列表等类型 以及各种 class classinstanc 等等都是对象 这些对象在 python 解释器内部的地址是怎样的呢 这里我们只简单看下 python 对象内存地址的相关基础知识 以及编码过程中一些注意事项 关于 python 解释器的内存管理机制 涉及到解释器内核的内存池原理 这里不做深入探讨 有兴趣的朋友可以去阅读解释器源代

    在python中,万物皆对象,常见的整数、浮点数、字符串、元祖、列表等类型,以及各种class、class instance等等都是对象。这些对象在python解释器内部的地址是怎样的呢?这里我们只简单看下python对象内存地址的相关基础知识,以及编码过程中一些注意事项,关于python解释器的内存管理机制,涉及到解释器内核的内存池原理,这里不做深入探讨,有兴趣的朋友可以去阅读解释器源代码。

0x01 不可变对象

    不可变对象是指对象的内存值不能被改变。Python中变量以引用的方式指向对象,如果变量引用了不可变对象,当改变该变量时,由于其所指的对象的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址,即变量引用了新的对象。

    数值类型(整数和浮点)、字符串str、元组tuple都是不可变类型。比如a=1,b=[1],c={‘a’:1},id(a)、id(b[0])、id(1)、id(c[‘a’])将输出一样的值,因为1是不可变对象,其在内存中是不可改变的。

0x02 可变对象

    可变对象是指对象的内存值可以被改变,变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的内存地址,通俗点说就是原地改变。列表list、字典dict、集合set是可变类型。

0x03 对象的内存地址

    可以使用内置函数id()查看python对象的内存地址。下面是一些注意事项:

    (1) python中所有数字、字符串、list等值,创建时会分配内存空间,变量通过引用的方式使用它们。比如a=1和b=1,id(a)和id(b)的输出一样,表示a和b都指向相同的内存地址,即引用了同一个不可变对象;但是a=[1]和b=[1],id(a)和id(b)将输出不一样的值,a和b指向的是不同的内存地址,即引用了不同的可变对象,说明各可变对象是相互独立的,在内存中有独立的内存地址

    (2) 可用 is 判断两个对象的id(即内存地址)是否一样,用 == 判断两个对象的值是否一样。None值也有内存地址

    (3) list、set对象有各自的独立内存空间,他们的各元素以引用的方式指向可变、不可变对象;

    (4) 函数形参的默认值,在内存中会开辟独立的内存空间。比如测试代码中test函数的param参数,其默认值是空list,如果调用时未传参,则param指向内存中预先分配好的地址,该地址存储的是list类型的值;当调用时传参为a,则param引用了a指向的内存空间;

    (5) python使用引用计数和垃圾回收来释放内存对象,每个内存对象都维护了一个引用计数包括各种数字、字符串、list、set等类型值,以及类实例对象等等,当这些对象的引用计数为 0 时,会被解释器回收内存。每次对对象进行引用操作,都会导致其引用计数加1, 如下面测试代码中的整数1,列表a、b、c、d、n都引用了整数1,以及test函数中的append操作,都会导致数字1的引用计数加1

    (6) copy和deepcopy方法都创建了新的内存对象,如测试代码中的b和c都是新的变量,其各个元素可能是指向同一个内存空间。赋值操作是指向同一个内存块,同时增加引用计数。copy是浅拷贝,deepcopy是深拷贝,特别对于可变对象,copy是以引用的方式指向同一个可变对象,而deepcopy会开辟新的内存地址,也就是创建了新的可变对象。

0x04 测试代码

# -*- coding: utf8 -*- import copy import sys a = [1, 2, [3, 4]] b = copy.copy(a) c = copy.deepcopy(a) d = a print 'address of a:', id(a) print 'address of b:', id(b) print 'address of c:', id(c) print 'address of d:', id(d) print 'address of 1:', id(1) print 'address of element 0 in a:', id(a[0]) print 'address of element 0 in b:', id(b[0]) print 'address of element 0 in c:', id(c[0]) print 'a=', a print 'b=', b print 'c=', c print 'd=', d a[0] = 99 print 'a=', a print 'b=', b print 'c=', c print 'd=', d print 'address of element 0 in a:', id(a[0]) print 'address of element 0 in b:', id(b[0]) print 'address of element 0 in c:', id(c[0]) print 'address of element 2 in a:', id(a[2]) print 'address of element 2 in b:', id(b[2]) print 'address of element 2 in c:', id(c[2]) a[2].append(5) print 'a=', a print 'b=', b print 'c=', c print 'd=', d def test(param=[]): print 'address of param:', id(param) param.append(1) print 'reference count of 1:', sys.getrefcount(1) return param print test(a) print test() print test() print 'a=', a print 'b=', b print 'c=', c print 'd=', d print 'reference count of 1:', sys.getrefcount(1) n = 1 print 'reference count of 1:', sys.getrefcount(1) del n print 'reference count of 1:', sys.getrefcount(1) 

0x06 运行结果

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200556.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:34
下一篇 2026年3月20日 上午10:34


相关推荐

  • 带你用最简单的方式获得小米完整root权限(无需刷第三方rom)

    带你用最简单的方式获得小米完整root权限(无需刷第三方rom)前提小米手机已经解锁并且刷入开发版 在安全中心打开 root 下载 adbadb 工具即 AndroidDebug Android 调试桥 用这个工具可以直接操作管理 android 模拟器或 android 设备 好了这不是今天的主要内容 链接在此 http adbshell com downloads 压缩包里面是这个样子解压 然后去 C Windows System32

    2026年3月16日
    2
  • 数字电子技术课程设计八路抢答器报告_八路抢答器课程设计参考

    数字电子技术课程设计八路抢答器报告_八路抢答器课程设计参考数字电子技术课程设计-八路抢答器有错误请指正

    2022年10月20日
    4
  • SpringBoot整合RabbitMQ 实现五种消息模型 详细教程

    SpringBoot整合RabbitMQ 实现五种消息模型 详细教程今天说下了消息队列中间件,各种队列性能对比,RabbitMQ队列,交换机(Exchange)以及消息中间件的应用场景,然后带着大家一起实现RabbitMQ的五种消息模型。消息队列中间件消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和终一致性[架构]使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,K…

    2022年5月15日
    44
  • 清关报关知识详解_海关清关中是什么意思

    清关报关知识详解_海关清关中是什么意思  加工中心清关代理流程报关知识科普    进口泰国二手加工中心清关代理流程报关知识科普    机电企业产品的定义:机电技术产品是指使用进行机械、电器、电子信息设备所生产的各类农具机械、电器、电子系统性能的生产管理设备和生活用机具。一般包括机械设备、电气设备、运输工具、电子产品、电子产品、仪器仪表、金属产品及其零部件。    那么什么是二手设备?    (一)已经可以使用(不含使用前测试、调试的设备),仍具备基本信息功能和一定能够使用时间价值的;    (二)未经使用,但是超过质量保

    2026年2月8日
    4
  • linux pycharm激活码[免费获取][通俗易懂]

    (linux pycharm激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月21日
    245
  • 关于使用preparestatement来实现模糊查询

    关于使用preparestatement来实现模糊查询关于使用prparestatement来实现模糊查询

    2022年6月4日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号