首页 > 其他 > 详细

十五、is,==,id 的用法、代码块、缓存机制

时间:2019-05-14 01:18:02      阅读:140      评论:0      收藏:0      [点我收藏+]

一、is,==,id  的用法

id is ==

# id 身份证号
i = 100
s = ‘alex‘
print(id(i))     #1785952368
print(id(s))     #2116944573304
?
# == 比较的是两边的值是否相等
l1 = [1, 2, 3]
l2 = [1, 2, 3]
print(l1 == l2)
#   True
?
s1 = ‘alex‘
s2 = ‘alex ‘
print(s1 == s2)
#   False
?
# is 判断的是内存地址是否相同
l1 = [1, 2, 3]
l2 = [1, 2, 3]
print(id(l1))     #2017608169224
print(id(l2))     #2017607176840
print(l1 is l2)   # False
?
s1 = ‘alex‘
s2 = ‘alex‘
print(id(s1))     #2672204821368
print(id(s2))     #2672204821368
print(s1 is s2)   #   True
?
?
  • is 判断的是内存地址是否相同

  • == 比较的是两边的值是否相等

  • id相同,值一定相同

  • 值相同,id不一定相同

二、代码块

  • 代码块

    • 代码块:我们所有的代码都需要依赖代码块执行

    • 一个文件就是一个代码块

    • 交互式命令下 ,一行就是一个代码块

  • 两个机制:同一个代码块下,有一个机制;不同的代码块下,遵循另一个机制

三、缓存机制(字符串驻留机制)

  • 同一个代码块下的缓存机制

    • 前提条件:同一代码块内

    • 机制内容:

      ? Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。

      ? 换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同。

      Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。

    •  

    • 适用对象: int bool str

    • 具体细则:所有的数字 ,bool ,几乎所有的str

    • 优点:节省内存,提升性能

  • 不同代码块下的缓存机制:小数据池

    • 前提条件:不同代码块内

    • 机制内容:

      ? Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。

      ? python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。

        其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。

      在内存中开辟两个空间,一个空间存储-5~256的int,一个空间存储一定规则的字符串,如果你的代码遇到了满足条件的数据,直接引用提前创建的

    • 适用对象: int bool str

    • 具体细则:-5~256 ,bool ,满足规则的字符串

    • 优点:节省内存,提升性能


    i1 = 1000
    i2 = 1000
    i3 = 1000
    print(id(i1))    #2611114773872
    print(id(i2))    #2611114773872
    print(id(i3))    #2611114773872
    ?
    l1 = [1,2,3]
    l2 = [1,2,3]
    print(id(l1))    #2054243251976
    print(id(l2))    #2054242259592
    ?
    i = 800
    i1 = 800
    s1 = ‘hfdjka6757fdslslgaj@!#fkdjlsafjdskl;fjds中国‘
    s2 = ‘hfdjka6757fdslslgaj@!#fkdjlsafjdskl;fjds中国‘
    print(i is i1)     #True
    print(s1 is s2)    #True
    ?
  • 总结:

    ? 1.面试题考

    ? 2.回答时一定要分清:同一个代码块下适用一个缓存机制,不同代码块下适用另一个缓存机制(小数据池)

    ? 3.小数据池:数字范围是-5~256

    ? 4.缓存机制的优点:提升性能,节省内存

十五、is,==,id 的用法、代码块、缓存机制

原文:https://www.cnblogs.com/yangzm/p/10859746.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!