zoukankan      html  css  js  c++  java
  • python -java 数据内存解析

    最近使用python 做了下跟业务相关的复杂数据类型处理,碰到很多变量引用的问题,这里的东西还是蛮多的,跟java 管理内存的方式有很多地方一样但又有不同,此处记录一下。

    1.了解下基本数据类型和引用数据类型

      1.1java 有八种基本数据类型,byte short int long char float double boolean 对于基本数据类型的比较,都是用==来比较两者的值是不是相等。

      1.2 引用数据类型。(equals object 方法不是运算符,只能被对象使用,== 是运算符)
      一般情况下,equals和==是一样的,都是比较的两者的地址值是不是一样。但是也有特殊情况,比如,我们都知道所有类都是继承自Object基类,Object中的equals方法中是使用==来实现的,即比较的是两者的地址值。但是,Object的子类可以重写equals方法,比如Date、String、Integer等类都是重写了equals()方法,比较的是值是否相等。例如,在String类的equals()源码中,先比较是不是指向同一个地址,如果不是再比较两者是不是值相等。这个时候,equals和==所表达的含义显然就不一样了。(开发过程中很多场景需要重写equals 方法来比较两个对象)

      1.3 python有 数字、字符串、列表、元组、字典、集合这六种基本数据类型。在此基础上,python提供封装了其他的数据类型(datetime,calendar,collections,enum,pprint,heapq,bisect)

    2.基本数据类型的内存管理

      1.对于python来说,整型,布尔型,字符串是以常量池(java)的形式存储

      

      可以看到,将a,b 都赋值为1 ,但是a,b 的地址都指向相同的内存地址,这个原理跟java 是不同的

      但是,float dict  list  数据类型会分配不同的存储地址

      

       

      2. java 的变量分为局部变量和方法区内变量(静态区 和 常量池 )

        2.1 方法内部声明的变量的引用都放到了栈内存中,由于java 所有的赋值操作放到了类中,那么int a = 1 ; int b = 1 这个操作会在堆空间中运行时分配加载

        2.2 Object a = Person("zhang");Object b = Person("zhang")

          

         p1 p2 虽然实例化传值一样,但是还是会指向两个不通的 对象 object


         总结:暂时可以简单理解为python 整型 布尔型 字符串的定义和引用全部都放到了 常量池(不可变性,会自动检测是否有相同数值,有的话就指针指向,没有则新增指针指向),而复杂的数据结构如 list  dict set  float 放在了堆,即使字面量赋值一样也不会自动引用,而是重新开辟内存存储。如果不是字面量赋值,而是通过append 或者 dict[key] = value 方式则操作的是原来的数据。这里跟java不同,也是python 特有的优点,利用这个特性,在处理数据结构时通过这个技巧可以做出很多酷操作。

        

         

     这里有一篇文章对 javascirpt  内存管理讲的挺好的 一起分享下  https://www.cnblogs.com/lsgxeva/p/7976019.html

  • 相关阅读:
    驱动模块和装模块的概念——Junit单元测试案例
    虚拟机配置Openstack常见问题汇总
    Ubuntu配置OpenStack 二:配置时间同步NTP和安装数据库Maridb以及问题总结
    Ubuntu配置OpenStack 一:主机环境配置以及问题总结
    Eclipse连接SQL Server 2008数据库 以及问题总结
    linux信号与trap命令
    shell之数组
    wget下载命令 与功能更强大的 curl 文件传输命令
    RSync 文件备份同步
    rhel7和centos7的新防火墙软件 firewalld
  • 原文地址:https://www.cnblogs.com/my-python-2019/p/12718835.html
Copyright © 2011-2022 走看看