• python内存相关问题


    想要弄清楚内存相关的问题,就要理清楚:变量、内存地址、值之间的关系:
    1.程序里什么时候分配新的内存地址?
    答:1.定义一个变量,内存就开辟一个内存空间,分配一个内存地址.
          特殊:
              如:a=687
              a=197
                print(a)# 输出197
              这是2内存个地址,输出a,是输出第二a的个值,a指向值为197的内存地址,第一个a的值687 还存在,但是a不指向它了,

    2.一个列表里的变量存放的是啥?
    答:放的是变量的内存地址

    3.变量的类型可以是哪些?
     答:整数,字符串,列表,字典,元组,所有数据类型

    4.判断操作是 赋值 还是 修改变量的值
    答:4.1 如果是赋值则:开辟新的内存空间,分配新的内存地址(python小数据池除外)

    请体会如下3种赋值的不同

    第一种:开辟了新的内存空间

    第二种:赋值是把v1的内存地址给v2

    第三种:(记)python小数据池中只要数值相同,内存地址就相同,这是python的缓存机制

     4.2 如果是修改变量本身的值:


    5.python的小数据池对内存地址的影响?
    答:数据范围以内的数[-5,256],只要数值相同,内存地址就相同

    补充:
    # 按理 v1 和 v2 应该是不同的内存地址。特殊:
    1. 整型: -5 ~ 256
    2. 字符串:"alex",'asfasd asdf asdf d_asdf ' ----"f_*" * 3 - 重新开辟内存

    6.python变量数值垃圾回收机制
    如 a=30
      a=20
    a被赋了新值 20 ,之前的值 30 会被解释器垃圾回收机制自动 回收

    ##################################   分隔符   #####################################
    变量是为了写代码方便理解,其实是变量指向一个值的内存地址,

    重新赋值,原来的值没有改,还在内存中,只是没有变量,指向它的内存地址了,

    一个值对应一个内存地址,两个一样的值也是2个地址(python小数据池除外)
    1.不可修改的数据类型,string...等、或其他 内置函数 操作后 ,产生新的值, 旧值没有改变,新值没有变量指向


    ##################################   分隔符   #####################################


    '''
    23. v1 = '人生苦短,我用Python'  # v1 是一个变量,指向'人生苦短,我用Python'的内存地址
       v2 = [1,2,3,4,v1]   #注 这里的v1,放的是v1的内存地址,
    v1 = "人生苦短,用毛线Python"
    print(v2)

    # 输出 [1, 2, 3, 4, '人生苦短,我用Python']

    解释:v1 = "人生苦短,用毛线Python" 是对v1 赋值,在内存中开辟了一个新的内存空间,即第一个v1 和 第二个 v1 的内存地址不一样,
    而 v2中元素v1存放的是第一个v1的内存地址所对应的值。
    '''
    '''
    24. 看代码写结果并解释原因
    data_list = []
    data = {}
    for item in range(10):
    data['user'] = i
    data_list.append(data)
    print(data_list)

    输出:[{'user':9},{'user':9},{'user':9},{'user':9},...] 一共9个
    解释:data是指向一个内存地址,append是把data添加到空列表data_list,
    data_list = [data,data,data,data,data,data,data,data,data,data]
    data指向一个内存地址,内存地址的下的值被修改,所以最后data={'user':9}
    data_list=[{'user':9},{'user':9},{'user':9},{'user':9},...] 一共9个
    '''

    '''
    25. 看代码写结果并解释原因
    data_list = []
    for item in range(10):
    data = {}
    data['user'] = i
    data_list.append(data)
    print(data_list)

    输出: [{'user':0},{'user':1},{'user':2},{'user':3},{'user':4},{'user':5},,{'user':6},{'user':7},{'user':8},{'user':9}]
    每次循环经过data = {} ,都添加加一个新的字典变量,开辟一个新的内存地址,再对字典添加键值对,最后追加到列表data_list中


    对比
    第一种
    第二种


  • 相关阅读:
    Atitit.数据库存储引擎的原理与attilax 总结
    Atitit.数据库存储引擎的原理与attilax 总结
    atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29
    atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29
    atitit.项目设计模式---ioc attilax总结v4 q11
    atitit.项目设计模式---ioc attilax总结v4 q11
    Atitit.attilax的 case list 项目经验 案例列表
    Atitit.attilax的 case list 项目经验 案例列表
    Atitit.python web环境的配置 attilax 总结
    Atitit.python web环境的配置 attilax 总结
  • 原文地址:https://www.cnblogs.com/yx12138/p/10651482.html
Copyright © 2020-2023  润新知