Python中的is运算符

本文深入探讨Python中对象的三要素:id、type和value,解析可变与不可变类型的区别,以及Python如何通过对象id判断同一性,节省内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查了挺久资料,有了自己的理解,记一下

首先要铺垫一些python的知识

对象(object)三要素

分别是id,type,value
大家都知道,当我们定义一个对象时,编译器会为该对象在内存池开辟相应的内存空间,而id就是这块内存的内存地址,可以通过id()获取。
type是数据类型(class),可以通过type()函数获取。
value便是这个对象的值。

可变类型与不可变类型

在python中,整数、浮点数、复数、字符串、元组都是不可变类型
即该类型的对象一旦创建了,就不能修改。
有人可能会问了

a = 1
a = 2

这a不是整数(不可变类型)吗,不是修改了吗?
其实a并不是对象,可以理解为指针,

而is判断的就是两个对象id是否相同,也就是判断两个对象在内存中是不是就是一个对象。
这样说可能有点懵,我们看下实例:

a = 1
b = 1
print(a is b)

这里的输出结果是True。为什么呢?明明是两个不同的变量啊。
其实不然。变量标识符不同,并不代表这两个不是同个对象

就好像李华,在家里妈妈喜欢叫他小华,在单位同事叫他老李,其实都是同个人,只是叫法不一样罢了。

那在Python中如何判断两个对象是不是同个对象呢?
很简单,就是用对象的id,两个变量指向的对象id相同,便是同个对象。

那为什么不可变类型数值(value)相同就会是同个对象呢?
这句话其实不全对。只有在同个函数内创建的相同值不可变类型对象时,python才会使用先前已经创建的值相同的对象,因为不可变类型的对象是不能修改的,不必担心对象的修改影响到其他变量,所以python采用了这种方法节省内存。

def create():
    a = ("A", "B")
    return a


def create2():
    a = ("A", "B")
    return a


A = ("A", "B")
D = ("A", "B")
c = create2()
b = create()
d = create2()
print(A is D)  # True
print(A is b)  # False
print(b is c)  # False
print(c is d)  # True
### Python 各类运算符详解 #### 算术运算符 算术运算符用于执行基本的数学计算,例如加法、减法、乘法和除法。以下是常见的算术运算符及其用法: | 符号 | 描述 | 示例 | |------|--------------------------|----------------| | `+` | 加法 | `a + b` | | `-` | 减法 | `a - b` | | `*` | 乘法 | `a * b` | | `/` | 浮点数除法 | `a / b` | | `%` | 取模(余数) | `a % b` | | `//` | 地板除 | `a // b` | | `**` | 幂运算 | `a ** b` | 地板除 (`//`) 返回的是整数值的结果[^5]。当涉及负数时,结果会向下取整。 ```python print(9 // 2) # 输出 4 print(-11 // 3) # 输出 -4 ``` --- #### 比较运算符 比较运算符用于比较两个值并返回布尔值(True 或 False)。这些运算符通常用于条件语句中。 | 符号 | 描述 | 示例 | |----------|--------------------|------------------| | `==` | 判断是否相等 | `a == b` | | `!=` | 判断是否不相等 | `a != b` | | `<` | 小于 | `a < b` | | `>` | 大于 | `a > b` | | `<=` | 小于等于 | `a <= b` | | `>=` | 大于等于 | `a >= b` | ```python print(5 == 5) # 输出 True print(5 != 6) # 输出 True ``` --- #### 逻辑运算符 逻辑运算符用于组合多个条件表达式,并返回布尔值。 | 运算符 | 描述 | 示例 | |--------|----------------------------|-----------------------| | `and` | 如果两者都为真则返回 True | `(a and b)` | | `or` | 如果任一者为真则返回 True | `(a or b)` | | `not` | 对布尔值取反 | `not a` | ```python x = True y = False print(x and y) # 输出 False print(x or y) # 输出 True print(not x) # 输出 False ``` --- #### 成员运算符 成员运算符用于测试序列中是否存在某个值。 | 运算符 | 描述 | 示例 | |--------|------------------------------|-------------------------| | `in` | 如果值存在于指定序列中返回 True | `'a' in 'abc'` | | `not in` | 如果值不存在于指定序列中返回 True | `'d' not in 'abc'` | ```python list_example = [1, 2, 3, 4] print(2 in list_example) # 输出 True print(5 not in list_example) # 输出 True ``` --- #### 身份运算符 身份运算符用于比较两个对象是否是同一个实例。 | 运算符 | 描述 | 示例 | |--------|--------------------------------|----------------------------| | `is` | 如果两个变量指向同一对象返回 True | `x is y` | | `is not` | 如果两个变量未指向同一对象返回 True | `x is not y` | 需要注意的是,`is` 和 `==` 存在差异。前者比较对象的身份,后者比较对象的内容[^4]。 ```python a = [1, 2, 3] b = [1, 2, 3] print(a == b) # 输出 True (内容相同) print(a is b) # 输出 False (不同对象) ``` --- #### 位运算符运算符作用于二进制表示的数据上,逐位进行操作。这类运算符主要用于底层开发场景。 | 运算符 | 描述 | 示例 | |--------|-------------------------------|---------------------| | `&` | 按位与 | `a & b` | | `\|` | 按位或 | `a \| b` | | `^` | 按位异或 | `a ^ b` | | `~` | 按位取反 | `~a` | | `<<` | 左移 | `a << n` | | `>>` | 右移 | `a >> n` | ```python a = 60 # 二进制: 0011 1100 b = 13 # 二进制: 0000 1101 print(a & b) # 输出 12 (按位与) print(a \| b) # 输出 61 (按位或) ``` --- #### 运算符优先级 不同的运算符具有不同的优先级,这决定了表达式的求值顺序。高优先级的运算符会在低优先级之前被计算。括号可以改变默认的优先级。 | 类别 | 运算符 | |--------------|------------------------------------------| | 括号 | `()` | | 求幂 | `**` | | 单目正负号 | `+, -` | | 乘法/除法 | `*, /, //, %` | | 加法/减法 | `+, -` | | 移位 | `<<, >>` | | 按位与 | `&` | | 按位异或 | `^` | | 按位或 | `\|` | | 比较 | `<, <=, >, >=, ==, !=` | | 身份比较 | `is, is not` | | 成员检测 | `in, not in` | | 逻辑与 | `and` | | 逻辑或 | `or` | | 条件赋值 | `=` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值