• Python中数据在内存中存储汇总


    python 语言的三大基本点是:数据结构、函数、对象类。基本上所有应用都是围绕这三点进行展开的。

    一、数据结构

    1.1 python中变量存储方式:

      python中变量赋值是将对象的引用地址给变量,其类似于c语言中的指针;而c语言中变量赋值,存储的是对象的值,只有用指针变量指向对象,才是将对象的地址给指针变量保存。

     例如python中:
     a=1
     d=a #将a中1的引用地址给d
      例如c语言中
      int *c;
      int d;
      c=&a; #将a的地址给c
      d=a; #将a的值给d,

    1.2可变数据与不可变数据类型

           python的数据类型主要有整型int、浮点型float、字符串str、列表list、元组tuple、字典dict、集合set、类class。根据其在内存中引用的方式不同分为不可变数据类型(整型int、浮点型float、元组tuple、字符串str)和可变数据类型(列表list、字典dict、集合set、类class)。引用故名思义是调用内存中的数据,一般是通过变量来调用数据。

    例如 :a=1,a指向1所在的内存引用地址。   

          着重解释一下可变与不可变数据:可变与不可变主要指这个数据在内存中的存储位置是否发生改变。例如:    

    a=1
    a1=1
    print(id(a))
    print(id(a1))
    print("----------------------")
    b=[]
    b1=[]
    print(id(b))
    print(id(b1))
    

     打印结果如下:

    1862322304
    1862322304
    ----------------------
    10110416
    10111576
    

        对于int型,a=1和a1=1,a和a1变量同时指向1的内存引用地址,不论使用多少赋值语句,数字1在内存中的存储地址都不会发生改变,充其量是多个变量同时引用1的内存地址,系统不会再给1开辟另外的内存空间进行存储; 但对于list这种数据类型,正好相反,b和b1两个变量指向两个内存引用地址,相当于[]在系统中有两个存储区域,变量引用一次,开辟一个区域存储[]。总结:对于可变数据类型,数据在内存中的存储位置不唯一,可以改变,引用一次相当于在内存中开辟一个存储区域;对于不可变数据,数据在内存中的存储位置是唯一的。

           现在再来看 这一语句: a=数据1。其在python中的运行机制,可以解释为(推测) :判断数据1的类型,如果是可变数据,则开辟空间,存储数据1,将数据1的引用地址给a;如果是不可变数据,查找内存中是否有该数据,若有,将数据1的引用地址给a,若无,开空间,存储数据1,然后将引用地址给a。

    1.3 python中关于copy包的数据调用:

      数据copy满足下列规则:

       规则1:拷贝表义是开辟新空间,存储对象。copy分浅拷贝(copy)和深拷贝(deepcopy)。浅拷贝只复制表层数据,深拷贝是递归赋值数据。
       规则2:两种拷贝都是针对可变数据类型而言,对于不可变数据类型,copy相当于赋值,即不另开辟空间,保存数据。例如:
    import copy
    a="hello"
    b=copy.deepcopy(a)
    print(id(a),id(b))#a,b的id一致
       深层解析一下上面两句规则。例如:
    import copy
    a=[1,2]
    b=(5,6)
    c=[a,b,110]
    d=(a,b,110)
    e=copy.copy(c)
    e1=copy.copy(d)
    print(id(e),id(c))#只copy表层
    print(id(e1),id(d))#因表层是元组不可变数据类型,相当于赋值,e,d指向同一引用地址

    试试深copy:

    e=copy.deepcopy(c)
    e1=copy.deepcopy(d)
    print(id(e),id(c))
    print(id(e1),id(d))#虽表层数据是元组格式,深copy时递归检测内层数据是列表,会开空间执行操作

    #深copy会递归copy数据,但若根数据是不可变数据类型,则根数据不进行copy

    再操作,打印内层数据:

    print(id(e[1]),id(c[1]))#因(5,6)数据是不可变数据,且内部5和6均为不可变,则不copy

    1.4 数据操作

           数据的操作一般是查改增删。

           查找:find ,index,count , len ;

           改(针对字符串):sort,reverse,split ,replace, upper, lower, join,capitalize ;

           删:del ,remove, pop 

           增:insert ,add, append ,extend;

           判断(针对字符串):isdecimal,islower,isalpha, issupper, startswith,endswith 。当然字符串的操作可以用正则表达式进行代替

  • 相关阅读:
    Codeforces Round #747 比赛记录(vp)
    神秘姿势:把 K(2n) 分解成 2n-1 组完美匹配
    Codeforces Round #745 比赛记录(vp)
    NOIP Camp #2 比赛记录
    数论 专题整理
    Java基础之流程控制语句
    Java基本类型
    开启学科模式
    Strange Queries (莫队+容斥原理)
    洛谷P1993 小K的农场
  • 原文地址:https://www.cnblogs.com/xuehaiwuya0000/p/10800056.html
Copyright © 2020-2023  润新知