zoukankan      html  css  js  c++  java
  • 内存管理

    python: 查看内存地址。

    1 a=1
    2 print a
    3 #输出物理内存地址 
    4 print id(a) 
    5 #输出物理内存地址(十六进制)
    6 print hex(id(a))
    View Code

    内存基础(C语言):

    一个程序就是一个进程。

    堆、栈、全局/静态存储区和常量存储区。

    什么是常量,全局变量,局部变量和全局静态变量?

    答:常量:不可更改的,一般用const 或者 define 修饰.

      全局变量:一般用 global 修饰,在函数体外定义的变量,在总个项目有效。

      局部变量:在函数体内定义的变量,在函数体内有效。

      全局静态变量:一般用 static修饰,在本文件内有效,只初始化一次,下一次结果依赖这一次的数据。

    全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,

    局部变量存放在内存的栈区。系统会自动释放。

    静态存储区,意识就是说程序编译时调用时就已经分配好的内存。进程只要存在就不会被释放。

    一般函数对象和结构分配到内存的堆区。一般由程序员手动释放。

    在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象

     1 #is 判断对象内存是否相等
     2 # True
     3 a = 1
     4 b = 1
     5 print(a is b)
     6 print(id(a),id(b))
     7 
     8 # True
     9 a = "good"
    10 b = "good"
    11 print(a is b)
    12 print(id(a),id(b))
    13 # True
    14 a = "very good morning"
    15 b = "very good morning"
    16 print(a is b)
    17 print(id(a),id(b))
    18 # False
    19 a = []
    20 b = []
    21 print(a is b)
    22 print(id(a),id(b))
    View Code

    在Python中,每个对象都有存有指向该对象的引用总数,即引用计数(reference count)。

    python中一切皆对象

    比如:a=10,b=10   a是一个对象 b是一个对象 10也是一个对象。所以 id(a)==id(b)

    但是 相对于list和dict来说,更改内部属性值是不会改变他的地址,比如说a重赋值为20,id(a)肯定会改变。但是 list[3]=90,id(list)不会改变。

    所以

    def swap(a,b,c):
        a,b,c=b,c,a

    是无法交换的

    但是

    def swap(list):
        list[0],list[1],list[2]=list[1],list[2],list[0]
        
    if __name__=='__main__':
        a=[1,3,5]
        swap(a)
        print a

    是可行的

     

    我们可以使用sys包中的getrefcount(),来查看某个对象的引用计数。需要注意的是,当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。

    1 from sys import getrefcount
    2 
    3 a = [1, 2, 3]
    4 print(getrefcount(a))
    5 
    6 b = a
    7 print(getrefcount(b))
    View Code
  • 相关阅读:
    Scanner和BufferedReader
    java annotation
    java获取短uuid
    定时任务线程
    sql 查询最近30分钟或者自定义时间数据
    查看base64编码图片
    oracle 的PACKAGE恢复过程
    Oracle BFILE备忘
    读取Spring的配置文件applicationContext.xml的5种方法
    解决eclipse ctrl+鼠标左键不能用
  • 原文地址:https://www.cnblogs.com/canbefree/p/3813823.html
Copyright © 2011-2022 走看看