zoukankan      html  css  js  c++  java
  • 07_Python变量内存地址、小数据池

    一、变量在内存中的地址

    变量:用来标识(identify)一块内存区域。为了方便表示内存,我们操作变量实质上是在操作变量指向的那块内存单元。编译器负责分配。我们可以使用Python内建函数id()来获取变量的地址

    变量名:是一个标识符(dientify),用来代之一块内存空间,使用这个变量名,我们可以很方便的操作这块内存区域。

    内存:内存是我们电脑硬件,用来存放数据,形象的理解就是内存有一个一个的小格子组成,每个格子的大小是一个字节,每个格子可以存放一个字节大小的数据。我们如何才能知道,数据存放在哪些格子中,那就得靠地址,地址类似于楼房的门牌号,是内存的标识符。

    二、Built-in Function id()

    python开发文档中对id()的描述

    id(object) 
    Return the "identify " of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.
    
    CPython implementation detail: This is the address of the object in memory.
    
    返回对象的"标识"。这是一个整型,它保证了变量唯一的和恒定的在该对象的生命周期。具有不重叠生命周期的两个对象可以具有相同的id()值。
    
    Cpython 实现细节:返回对象在内存中的地址。

    三、id()的使用

    id()

    id(object)函数是返回对象object在其生命周期内位于内存中的地址,id函数的参数类型是一个对象。

    >>> x = 'zhangsan'
    >>> y = 'zhangsan'
    >>> id(x)
    1619186681456
    >>> id(y)
    1619186681456

    在上面的代码中,我们定义了两个变量x,y。为什么x的地址和y的地址相同?在Python中,先申请一块内存分配给str对象来存储'zhangsan',然后x指向’zhangsan‘。实际上让x指向’zhangsan‘所在的内存块。

    而id(x) == id(y)说明x和y指向的是同一对象,y = 'zhangsan'并不会重新给str分配内存,而是让y直接指向了已经存在的str类型的变量x。

    因为本身只是想给y赋值一个str,而在内存中已经存在了这样的一个str对象,所以直接让y指向了已经存在的对象。

    四、is() 和 == 的区别

    is()判断a对象和b对象是否相等,使用过id来判断

    ==判断的是a对象和b对象的值是否相等,是通过value来判断

    '''
    True
    True
    1507487200
    1507487200
    '''
    a = 1
    b = 1
    print(a == b)
    print(a is b)
    print(id(a))
    print(id(b))
    
    '''
    True
    False
    1507487200
    1507487232
    '''
    a = 257
    b = 257
    print(a == b)
    print(a is b)
    print(id(a))
    print(id(b))

    上面两段代码,当a = 1,b = 1的时候a is b 是True;而当a = 257,b=257的时候a is b 是False。

    按照我们之前的测试,为什么a=257,b=257,两个变量不指向同一块内存单元了呢?

     其实这是Python解释器的原因,如果放在IDE中,没有这样的问题,Python为了优化速度,会把[-5,256]之间的数据提前放到小整数池中,程序只要用[-5,256]之间的数据不会再重新创建一份,都是指向对象池中的同一份数据,除了这个区间之外的数据,都会重新创建新的内存空间。

    str也有小数据池。规定:

     1.不能有特殊字符串,全部由字母组成的字符串

     2.s*20还是同一个地址,s*21以后就是两个内存地址了

    除了整型和字符串,其他数据类型都没有小数据池

  • 相关阅读:
    hihocoder 1388 Periodic Signal
    HDU 5880 Family View (AC自动机)
    HDU 5889 Barricade (bfs + 最小割)
    UVa 10806 Dijkstra, Dijkstra (最小费用流)
    POJ 3169 Layout (差分约束)
    差分约束系统学习
    HDU 3062 病毒侵袭持续中 (AC自动机)
    HDU 2896 病毒侵袭 (AC自动机)
    HDU 2222 Keywords Search (AC自动机)
    项目管理工具Leangoo,截止日期终于变绿色了
  • 原文地址:https://www.cnblogs.com/weihengblog/p/8375785.html
Copyright © 2011-2022 走看看