精华内容
下载资源
问答
  • 我们知道Python中对象包含个基本要素:id(身份标识),type(数据类型)和 value(值)。 is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同,下面来看看具体区别在: ==比较操作符 和 ...

    比较操作符和同一性运算符

    Python中有很多运算符,今天注意讲一下is和==两种运算符在应用上的本质区别是什么。

    我们知道Python中对象包含的三个基本要素:id(身份标识)type(数据类型) value(值)

    is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同,下面来看看具体区别在哪:

    ==比较操作符is同一性运算符

    ==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等,例如:

    is也被叫同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同

    通过对下面几个list间的比较,解释is同一性运算符的工作原理:

    为什么x is z是False呢?

    x、y和z的值是相同的,所以前两个是True没有问题。至于最后一个为什么是False,看看三个对象的id分别是什么就会明白了。

    下面再看一个例子:

    从例子中可以看出,只有数值型和字符串型的情况下,a is b才为True,当a和b是tuple,list,dict或set类型型时,a is b为False。

    注意:

    事实上Python 为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。而Python 对小整数的定义是 [-5, 257),只有数字在-5到256之间它们的id才会相等,超过了这个范围就不行了,同样的道理,字符串对象也有一个类似的缓冲池,超过区间范围内自然不会相等了。 

    总的来说,只有数值型和字符串型,并且在通用对象池中的情况下,a is b才为True,否则当a和b是int,str,tuple,list,dict或set型时,a is b均为False。

    小数据池(注意只有字符串和数值有这个概念)

    在一定范围之内的,共用同一个内存地址。 
    数字 -5~256 节省空间(内存),共用的都是一个小数据池(指向的是同一个内存地址)

    小整数对象[-5, 257]在python中是共享的 
    (注,用列表表示是因为python中含首不含尾,所以[-5,257)表示的范围也就是数字 -5~256。) 
    整数对象都是从缓冲池中获取的。 

    整数对象回收时,内存并不会归还给系统,而是将其对象的ob_ject指向free_list,供新创建的整数对象使用。

    1.小整数对象——小整型对象池

    [small_ints的链表]

    在实际编程中,数值比较小的整数,比如1,2,3等会频繁出现。

    Python中,所有的对象都存在于系统堆上。

    如果某个小整数出现的次数非常多,那么python将会出现大量的malloc/free操作,这样大大降低了运行效率,而且会造成大量的内存碎片,严重影响python的整体性能。

    所以在python2.5乃至3.6中,将小整数位于[-5,257)之间的数,缓存在小整型对象池中。

    2.大整数对象——通用整数对象池

    python将小整型数完全的缓存在了小对象缓存池中了。 
    而那些大整数对象呢? 
    python运行环境也有提供一块内存空间供大整数轮流使用。 
    这块内存空间就是PyIntBlock。 
    通常称为通用整数对象池。 (所以大整数也是有缓存的)

    该对象使用链表组织,所以哪怕两个大整数变量有着相同的值,但是在链表中确是不同的节点,不在是一个对象了。

    字符串intern

    关于字符串的intern内存驻留机制:

    Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable. Interning strings makes some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when the string is created or interned. The distinct values are stored ina string intern pool. –引自维基百科
    译: 
    在计算机科学中,string interning是一种只存储每个不同字符串值的onecopy的方法,它必须是不可变的。连接字符串使得一些stringprocessing任务更费时——或者更节省空间,因为在创建或插入字符串时需要moretime。不同的值存储在字符串驻留池中。

    也就是说值相同的字符串对象只会保存一份,是共用的,所以字符串必须是不可变对象。 
    就跟小整数对象一样,相同的数值只要保存一份就行了,没必要用不同对象来区分。

    同时以上也说到了这样做的优缺点:

    优点:能够提高一些字符串处理任务在时间和空间上的性能;需要值相同的字符串的时候(比如标识符),直接从池里拿来用,避免频繁的创建和销毁,提升效率,节约内存。

    缺点:在创建或插入字符串时会花费更多的时间。

    注意事项:

    1.拼接字符串

    字符串的改动不是inplace操作,需要新建对象,所以不推荐使用+来拼接字符串,推荐使用join函数因为join函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象。

    2.字符串驻留限制

    仅包含下划线(_),字母和数字的字符串会启用字符串驻留机制。

    因为解释器仅对看起来像python标识符的字符串使用intern方法,而python标识符正是由下划线,字母和数字组成。

    python默认只会对由字符“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz”(其实就是下划线,字母,数字)构成的字符串进行intern。

    这部分的逻辑在codeobject.c中的函数PyCode_New中:

    在该函数中,会调用all_name_chars,检查字符串是否全是由简单的字符组成,判断通过的字符串才会进行intern处理。

    这里的分析是对常量而言,对于计算机得出的字符串,也是不做intern的。

    在python2和python3中:

    python2中可以用intern()来对除此外的字符串进行处理使其共用一个内存空间,python3中不知为何对intern取消了支持。可能怕引起混乱吧,反正就默认了对那些看起来像是python标识符的进行intern。

    例:python27中支持intern() 

    python3中使用intern()会直接报错。(not defined)

    3.字符串驻留时机

    字符串只会在编译是驻留,而不是在运行时。

    例如:

    实现Intern机制就好比是通过维护一个字符串储蓄池,这个池子是一个字典结构,如果字符串已经存在于池子中就不用再去创建新的字符串,直接返回之前创建好的字符串对象,如果之前还没加入到池子中,则先构造一个字符串对象,并把这个对象加入到池子中,方便下一此获取。

    短字符串缓冲池characters

    另外,字符串除了有intern机制缓存字符串之外,还有一种专门的短字符串缓冲池characters。

    用于缓存字符串长度为1的PyStringObject对象。

    变长对象

    Python中将对象分为两种:一种是定长对象,比如整数,整数对象定义的时候就能确定它所占用的内存空间大小,另一种是变长对象,在对象定义时并不知道是多少,比如:str,list, set, dict等。

    参考:https://blog.csdn.net/u011300968/article/details/77160619

     

     

     

     

     

     

    展开全文
  • python is ==

    2017-09-25 13:34:00
    在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。...

    在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪。

    Python中比较两个对象是否相等,一共有两种方法,简单来说,它们的区别如下:

    is是比较两个引用是否指向了同一个对象(引用比较)。

    ==是比较两个对象是否相等。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> a = [1, 2, 3]
    >>> b = a
    >>> b is a # a的引用复制给b,他们在内存中其实是指向了用一个对象
    True 
    >>> b == a # 当然,他们的值也是相等的
    True
    >>> b = a[:] # b通过a切片获得a的部分,这里的切片操作重新分配了对象,
    >>> b is a # 所以指向的不是同一个对象了
    False
    >>> b == a # 但他们的值还是相等的
    True

    实现原理

    is比较的是两者是否是同一个对象,所以比较的是内存地址(id是否相同)。

    ==是值比较。不可变对象,例如int,str,它会直接进行值比较

    转载于:https://www.cnblogs.com/howhy/p/7591473.html

    展开全文
  • 在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看...

    Python中有很多运算符,今天我们就来讲讲is和==两种运算符在应用上的本质区别是什么。

    在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。

    is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪。

    ==比较操作符和is同一性运算符区别

    ==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等,例如下面两个字符串间的比较:

    例1.

    >>> a = 'cheesezh'

    >>> b = 'cheesezh'

    >>> a == b

    True

    is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。通过对下面几个list间的比较,你就会明白is同一性运算符的工作原理:

    例2.

    copycode.gif

    >>> x = y = [4,5,6]

    >>> z = [4,5,6]

    >>> x == y

    True

    >>> x == z

    True

    >>> x is y

    True

    >>> x is z

    False

    >>>

    >>> print id(x)

    3075326572

    >>> print id(y)

    3075326572

    >>> print id(z)

    3075328140

    copycode.gif

    前三个例子都是True,这什么最后一个是False呢?x、y和z的值是相同的,所以前两个是True没有问题。至于最后一个为什么是False,看看三个对象的id分别是什么就会明白了。

    下面再来看一个例子,例3中同一类型下的a和b的(a==b)都是为True,而(a is b)则不然。

    例3.

    copycode.gif

    >>> a = 1 #a和b为数值类型

    >>> b = 1

    >>> a is b

    True

    >>> id(a)

    14318944

    >>> id(b)

    14318944

    >>> a = 'cheesezh' #a和b为字符串类型

    >>> b = 'cheesezh'

    >>> a is b

    True

    >>> id(a)

    42111872

    >>> id(b)

    42111872

    >>> a = (1,2,3) #a和b为元组类型

    >>> b = (1,2,3)

    >>> a is b

    False

    >>> id(a)

    15001280

    >>> id(b)

    14790408

    >>> a = [1,2,3] #a和b为list类型

    >>> b = [1,2,3]

    >>> a is b

    False

    >>> id(a)

    42091624

    >>> id(b)

    42082016

    >>> a = {'cheese':1,'zh':2} #a和b为dict类型

    >>> b = {'cheese':1,'zh':2}

    >>> a is b

    False

    >>> id(a)

    42101616

    >>> id(b)

    42098736

    >>> a = set([1,2,3])#a和b为set类型

    >>> b = set([1,2,3])

    >>> a is b

    False

    >>> id(a)

    14819976

    >>> id(b)

    14822256

    copycode.gif

    通过例3可看出,只有数值型和字符串型的情况下,a is b才为True,当a和b是tuple,list,dict或set型时,a is b为False。

    展开全文
  • python-is,==

    2017-12-04 17:22:00
    在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。...

    在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪。

    Python中比较两个对象是否相等,一共有两种方法,简单来说,它们的区别如下:

         is是比较两个引用是否指向了同一个对象(引用比较)。

         ==是比较两个对象是否相等。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> a = [1, 2, 3]
    >>> b = a
    >>> b is a # a的引用复制给b,他们在内存中其实是指向了用一个对象
    True
    >>> b == a # 当然,他们的值也是相等的
    True
    >>> b = a[:] # b通过a切片获得a的部分,这里的切片操作重新分配了对象,
    >>> b is a # 所以指向的不是同一个对象了
    False
    >>> b == a # 但他们的值还是相等的
    True

     

    转载于:https://www.cnblogs.com/Bella2017/p/7978094.html

    展开全文
  • python ==与is的区别

    2020-01-05 11:55:37
    在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。 is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看...
  • 在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。...
  • 在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。 is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看...
  • 在讲is和这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。 is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看...
  • 在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。...
  • 在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。...
  • Python中is和==的区别

    2019-02-27 11:42:13
    在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。 is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来...
  • 在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。...
  • python is 和 == 和=

    2018-07-08 19:48:00
    在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。 is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来...
  • 在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。 is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看...
  • Python中is和==的区别*

    2020-03-10 20:41:50
    在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。 is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看...
  • 在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看...
  • Python中Is 和 == 的区别

    2019-08-28 14:26:06
    在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。 is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来...
  • Python中is和==的区别以及is None

    千次阅读 2019-04-16 15:14:43
    在讲is和==这两运算符区别之前,首先要知道Python中对象包含个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。 is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来...

空空如也

空空如也

1 2 3
收藏数 59
精华内容 23
关键字:

python包含哪三种数据类型

python 订阅