优秀的编程知识分享平台

网站首页 > 技术文章 正文

python中的is和==区别

nanyue 2025-02-15 00:27:40 技术文章 4 ℃

笔记记录20221203:


is比较的是两个对象的地址值,也就是说两个对象是否为同一个实例对象;

而==比较的是对象的值是否相等,其调用了对象的__eq__()方法;

# is比较的是两个对象的地址值,也就是说两个对象是否为同一个实例对象;
# 而==比较的是对象的值是否相等,其调用了对象的__eq__()方法;


# 1,查看区别:
"""
a和b,str1和str2,li1和li2,值都相同,所以==都为True;
但是:
a和b,str1和str2,地址都相同,所以 is 都为True
li1和li2,地址不相同,所以 is 为False
原因:
Python机制里面,默认会将比较小的值,缓存起来,使用的时候,指向同一个对象地址,节省内存空间
"""

a = 10
b = 10
print(a==b) # True
print(a is b) # True
print(id(a),id(b)) # 1187856280144 1187856280144
str1 = '123'
str2 = '123'
print(str1==str2) # True
print(str1 is str2) # True
print(id(str1),id(str2)) # 1187858032496 1187858032496
li1 = [1,2,3,4]
li2 = [1,2,3,4]
print(li1==li2) # True
print(li1 is li2) # False
print(id(li1),id(li2)) # 1187858035456 1187861814912



# 2,查看区别:
"""
=赋值其实就是对对象的直接引用
c = a赋值引用,a和c都指向同一个对象,内存地址一致
"""

"""
在a和li3变化之前:
a==c  a is c  都是True;
li3==li4  li3 is li4  都是True;
在a和li3变化之后:
a==c  a is c  都是False;
li3==li4  li3 is li4  都是True;

原因:
number类型是不可变数据类型,当值发生改变时候,对应的内存地址就会改变;
list类型是可变数据类型,当值发生改变时候,对应的内存地址不会发生改变;
"""

a = 10
c = a
print(a==c) # True
print(a is c) # True
print(id(a),id(c)) # 1187856280144 1187856280144
a = 100
print('a:',a,'c:',c) # a: 100 c: 10
print(a==c) # False
print(a is c) # False

li3 = [1,2,3,4]
li4 = li3
print(li3==li4) # True
print(li3 is li4) # True
print(id(li3),id(li4)) # 1187861814976 1187861814976
li3.append(5)
# li3: [1, 2, 3, 4, 5] li4: [1, 2, 3, 4, 5]
# 因为两者指向同一个内存地址,所以li3变化了,li4跟着变化
print('li3:',li3,'li4:',li4)
print(li3==li4) # True
print(li3 is li4) # True
print(id(li3),id(li4)) # 1187861814976 1187861814976




最近发表
标签列表