python == 和 is

本文介绍了Python中使用`==`和`is`进行值比较和地址比较的区别,特别是针对字符串和列表这两种数据类型。在Python中,字符串是不可变的,因此相同值的字符串会指向同一内存地址,而列表即使值相同,也会有不同的内存地址。当改变字符串变量的值时,实际上是创建了新的字符串对象,不会影响其他引用该字符串的对象。这一特性在处理不可变对象如字符串时尤其重要,而对于列表等可变对象,赋值操作会导致对象引用的变化而非原对象的修改。

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

==一般是值的比较,is则是地址的比较

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a == b
True
>>> a is b
False

在上面这个例子中a和b的值是一样的,但他们指向的是不同的内存

>>> a = 'a'
>>> b = 'b'
>>> a == b
True
>>> a is b
True

我们会发现,列表值一样但内存地址不一样,但字符串两个变量值一样,地址居然也一样。这是什么原因呢?

首先我们知道字符串是不可更改的,这是因为字符串其实是常量,每一个字符串在内存中的地址都是唯一的。

当a变量申请一个’a’字符串的时候,会先去常量内存区找’a’字符串,没有就申请一块内存存’a’,再把’a’的地址返给变量a。

当b变量申请一个’a’字符串时,这个时候在常量内存区找到了’a’,就直接把地址返给变量b了,没有再取申请内存。

所以a, b变量其实是同一个对象

这个时候你可能会问了,那a,b都是同一个对象了,那我a变量值改变的时候,b是不是应该也改变

>>> a = 'a'
>>> b = 'b'
>>> a = 'c'
>>> a is b
False

其实因为字符串时常量不可改变,所以当a=‘c’时,并不是把a原来所指向的字符串’a’的内存把值改为’c’,而是a把指向地址改变指向到了常量’c’字符串的内存上去了,所以b的指向没有变,b也不会跟着a的值改变而改变了。

这也是为什么我们不能修改字符串中的某个字符,而要把字符串转为列表来修改。

不仅字符串,整型, bool型,None型也都是这样的常量

### Python 中 `is` `==` 进行 `None` 比较的用法与差异 在 Python 编程语言中,比较对象是否为 `None` 可以通过两种方式实现:使用身份运算符 `is` 或者相等运算符 `==`。然而,在实践中推荐使用 `is` 来判断变量是否指向 `None` 对象。 #### 使用 `is` 关键字 `is` 是用于检查两个操作数的身份是否相同的操作符。对于 `None` 的检测来说,这意味着它会验证左侧的对象是否确实是指向全局唯一的 `None` 实例。由于 Python 内部机制确保了只有一个 `None` 单例存在,因此这是最可靠的方法来确认某个值是不是真正的 `None`[^1]。 ```python value = get_some_value() if value is None: print("Value is exactly None.") else: print("Value is not None.") ``` #### 使用 `==` 符号 另一方面,`==` 则是用来测试两个表达式的值是否相等。当应用于 `None` 时,这同样可以工作得很好,因为任何东西等于 `None` 都会被认为是假(除非该事物本身确实是 `None`)。不过需要注意的是,理论上可能存在自定义类实例重载了 `__eq__()` 方法使得它们能够返回真即使不是严格意义上的 `None`[^2]。 ```python class CustomClass: def __eq__(self, other): return True custom_instance = CustomClass() print(custom_instance == None) # 输出可能是True取决于CustomClass的行为 print(custom_instance is None) # 总是False,因为它不是一个真实的None单例 ``` 综上所述,虽然两者都能用来做 `None` 的对比,但是为了代码的安全性清晰度考虑,建议总是采用 `is` 而不是 `==` 去执行这样的检查[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值