python ==和is_python中is是什么意思

python ==和is_python中is是什么意思前置知识点当我们创建一个对象时,我们要知道它内部干了些什么1.创建了一个随机id,开辟了一片内存地址2.自动声明了这个对象的类型type3.给这个对象赋值value小例子a=1pri

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前置知识点

当我们创建一个对象时,我们要知道它内部干了些什么

  • 1.创建了一个随机id,开辟了一片内存地址
  • 2.自动声明了这个对象的类型type
  • 3.给这个对象赋值value
     

小例子

a = 1
print(id(1))
print(id(a))
print(type(a))

结果

4470700832
4470700832
<class 'int'>

可以明显看出数字1的内存地址跟对象a的内存地址是一样的,a = 1的原理是首先内存中有一个id=4470700832type=intvalue=1的对象,然后创建a对象指向1,此时a的id、type、value跟1的一样
 

is和==的区别

上面分析了创建对象的整个内存过程,那么接下来理解is和==的区别就好多了

  • is:用于判断两个变量引用对象是否为同一个,既比较对象的地址。
  • ==:用于判断引用变量引用对象的值是否相等,默认调用对象的 __eq__()方法。
>>> a = 257
>>> b = 257
>>> id(a)
140204598140720
>>> id(b)
140204598140400
>>> print(a is b)
False
>>> print(a == b)
True

根据我们上面讲解的,a的地址和b的地址应该跟257的地址相同,但是现在显然不同,这是为什么呢?下面会说明
 

整数缓存问题

Python 仅仅对比较小的整数对象进行缓存(范围为[-5, 256])缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样 的,这是因为解释器做了一部分优化(范围是[-5,任意正整数])。
 

总结

  • is 比较两个对象的 id 值是否相等,是否指向同一个内存地址
  • == 比较的是两个对象的内容是否相等,值是否相等
  • 小整数对象[-5,256]在全局解释器范围内被放入缓存供重复使用
  • is 运算符比 == 效率高,在变量和 None 进行比较时,应该使用 is。
     

字符串驻留机制

 

什么是字符串驻留?

字符串驻留是一种仅保存一份相同且不可变字符串的方法。
python ==和is_python中is是什么意思
基本原理
系统维护interned字典,记录已被驻留的字符串对象。
当字符串对象a需要驻留时,先在interned检测是否存在,若存在则指向存在的字符串对象,a的引用计数减1;
若不存在,则记录a到interned
 

为什么要字符串驻留?

  • 显而易见,节省大量内存
  • 在字符串比较时,非驻留比较效率o(n),驻留时比较效率o(1)。
    python ==和is_python中is是什么意思
     

字符串什么时候驻留?

1.字符串只在编译时进行驻留,而非运行时。

>>> a = "hello" + "world"
>>> a is "helloworld"
True
>>> a = "hello"
>>> b = "world"
>>> a + b is "helloworld"
False

 

2. 字符串长度为0和1时,默认都采用了驻留机制。

>>> a = "*"
>>> b = "*"
>>> a is b
True
>>> a = "**"
>>> b = "**"
>>> a is b
False

 

3. 字符串>1时,且只含大小写字母、数字、下划线时,才会默认驻留。

>>> a = "hello1_"
>>> b = "hello1_"
>>> a is b
True
>>> a = "hello!"
>>> b = "hello!"
>>> a is b
False

 

4. 用乘法得到的字符串,有以下2种情况。

  • a. 乘数为1时,详见Python代码:
# 乘数=1,仅含大小写字母、数字、下划线驻留
>>> a = "abcdefghijklmnopqrstuvwxyz1234567890_ABCDXYZ"
>>> b = a * 1
>>> a is b
True

# 乘数=1,含其他字符,长度≤1,默认驻留
>>> a = "#"
>>> b = "#" * 1
>>> a is b
True

# 乘数=1,含其他字符,长度>1,则不驻留
>>> a = "##"
>>> b = "##" * 1
>>> a is b
False
  • b.乘数>=2时,详见Python代码:
## 仅含有大小写字母、数字、下划线,默认驻留
>>> a = "hellohellohellohellohellohellohello"
>>> b = "hello"*7
>>> a is b
True

# 含其他字符串,默认不驻留
>>> a = "&&&&"
>>> b = "&"*4
>>> a is b
False

 

5. 字符串被sys.intern() 指定驻留。

>>> from sys import intern
>>> a = intern("hello#!")
>>> b = intern("hello#!")
>>> a is b
True
>>> 

最后,当不满足标识符规则时,则不会启用驻留机制,当然这只出现在命令行中,如果你使用pycharm则不会出现这样的情况,pycharm内部已经帮我们做了处理

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/165487.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月30日 上午11:16
下一篇 2022年7月30日 上午11:36


相关推荐

  • python aic准则_pythonAIC准则下线性回归实现及模型检验案例分析

    python aic准则_pythonAIC准则下线性回归实现及模型检验案例分析#coding=utf/8#time:2019/8/11#function:线性回归#author:Karenimportpandasaspdimportnumpyasnpimportstatsmodels.apiassmimportmatplotlib.pyplotaspltfromsklearnimportpreprocessingimportstatsmode…

    2022年5月24日
    42
  • 魔百盒CM211-2系列(ZG/CH/YS)海思MV300H/310芯片-刷机固件及教程

    魔百盒CM211-2系列(ZG/CH/YS)海思MV300H/310芯片-刷机固件及教程魔百盒CM211-2系列(ZG/CH/YS)海思MV300H/310芯片-刷机固件及教程固件说明:1、魔百盒CM211-2-全系列-海思Hi3798MV300H/310-通用NAND和EMMC卡刷固件,支持红外蓝牙遥控,支持常见多种无线,同时支持RTL8822BS、RTL8822CS、MT7661、MT7663、MT7668等无线;2、解除官方屏蔽无线功能,有线和无线正常使用;3、代工标识说明:一般没标识是朝歌代工,带有ZG字母的就是朝歌代工,带有CH字母的就是长虹代工,带有YS或YST字

    2022年7月24日
    66
  • 罗马时钟代码

    罗马时钟代码先看看效果图第一部分HTML页面代码<!DOCTYPEhtml><htmllang=”en”> <head> <metacharset=”UTF-8″> <metaname=”viewport”content=”width=device-width,initial-scale=1.0″> <met…

    2022年6月28日
    39
  • python dll注入监听_DLL注入和API拦截

    python dll注入监听_DLL注入和API拦截读《Windows核心编程》笔记一DLL注入和API拦截在Windows中,每个进程相互独立,都有自己的私有的地址空间,程序中使用的指针都是进程自己地址空间的一个内存地址,无法创建也没法使用其他进程的指针。这种机制使得各个进程之间不会相互影响,万一自己出现了问题,也不会影响到其他的进程。对用户来说,系统更加的稳定了,但是对于开发人员来说,会使我们很难编写能够与其他进程通信的应用程序或对其他进程进…

    2022年5月16日
    48
  • MAC 如何配置allure的环境变量「建议收藏」

    MAC 如何配置allure的环境变量「建议收藏」1、下载2.7版本allure:https://dl.bintray.com/qameta/generic/io/qameta/allure/allure/2.7.0/allure-2.7.0.zip2、配置allure的环境变量:(1)、解压已经下载的安装包:(2)、选中allure-2.7.0,右键->显示简介:查看位置信息(如果直接在下载文件夹没有,默认为:/Users…

    2022年7月26日
    47
  • ubuntu18.04安装ros melodic_ubuntu opengl

    ubuntu18.04安装ros melodic_ubuntu opengl软硬件(1)软件:装有ROS_melodic的Ubuntu18.04系统(2)硬件:台式机和kinectV1摄像头下载安装以及遇到的问题主要参考:https://blog.csdn.net/qq_29828623/article/details/60765043#PrepareWorkspacesource/opt/ros/melodic/setup.bashmkdir-p~…

    2026年1月14日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号