is 和 ==
is 判断两个变量是否是引用同一个内存地址。
== 判断两个变量是否相等。
如果不用 a = b 赋值,int 型时,在数值为 -5~256(64位系统)时,两个变量引用的是同一个内存地址,其他的数值就不是同一个内存地址了。
也就是,a b 在 -5~256(64位系统)时:
a = 100 b = 100 a is b # 返回 True
其他类型如列表、元祖、字典让 a、b 分别赋值一样的时:
a is b # 返回False
cash
is 和 ==
is 判断两个变量是否是引用同一个内存地址。
== 判断两个变量是否相等。
如果不用 a = b 赋值,int 型时,在数值为 -5~256(64位系统)时,两个变量引用的是同一个内存地址,其他的数值就不是同一个内存地址了。
也就是,a b 在 -5~256(64位系统)时:
a = 100 b = 100 a is b # 返回 True
其他类型如列表、元祖、字典让 a、b 分别赋值一样的时:
a is b # 返回False
风的尽头
== 和 is 的区别
is 判断两个对象是否为同一对象, 是通过 id 来判断的; 当两个基本类型数据(或元组)内容相同时, id 会相同, 但并不代表 a 会随 b 的改变而改变。
== 判断两个对象的内容是否相同, 是通过调用 __eq__() 来判断的。
1、当列表,元组,字典中的值都引用 a,b 时,总是返回 True,不受 a,b 值大小的影响
a=1000 b=1000 list1=[a,3,5] list2=[b,4,5] print(list1[0] is list2[0]) tuple1=(a,3,5) tuple2=(b,4,5) print(tuple1[0] is tuple2[0]) dict1={6:a,2:3,3:5} dict2={1:b,2:4,3:7} print(dict1[6] is dict2[1])
输出结果为:
True True True
2、当不引用a,b,直接用具体值来测试时,列表,字典,不受值大小影响,返回True,元组则受 256 值范围的影响,超出范围则地址改变,返回 False。
list1=[1000,3,5] list2=[1000,4,5] print(list1[0] is list2[0]) tuple1=(1000,3,5) tuple2=(1000,4,5) print(tuple1[0] is tuple2[0]) dict1={6:1000,2:3,3:5} dict2={1:1000,2:4,3:7} print(dict1[6] is dict2[1])
输出结果为:
True False True
3、当直接用列表、元组、字典本身来测试时,刚好相反,元组返回 True,列表,字典返回 False。
list1=[1000,3,5] list2=[1000,3,5] print(list1 is list2) tuple1=(1000,3,5) tuple2=(1000,3,5) print(tuple1 is tuple2) dict1={1:1000,2:3,3:5} dict2={1:1000,2:3,3:5} print(dict1 is dict2)
输出结果为:
False True False
barryxiao
关于 is 和 == 的标识问题
(1)只要是变量的值相同,标识都相同,没有-5~256的限制,看下面的例子:
a = 100000 b = 100000 if a is b: print('a 和 b 标识相同,标识为:',id(a)) else: print('a 和 b 标识不相同,a 标识为:',id(a),'b 标识为:',id(b))
输出结果为:
a 和 b 标识相同,标识为: 2158477874512
(2)同样的如果是负数,仍然没有上述限制:
a = -100000 b = -100000 if a is b: print('a 和 b 标识相同,标识为:',id(a)) else: print('a 和 b 标识不相同,a 标识为:',id(a),'b 标识为:',id(b))
输出结果为:
a 和 b 标识相同,标识为: 2137845175632
(3)列表也是一样的,只要是列表项数值一样,那么标识也是一样的。例子如下:
list1 = [10000,20000,30000] list2 = [10000,12000,15000] if list1[0] is list2[0]: print('list1[0] 和 list2[0] 标识相同,标识为:',id(list1[0])) else: print('list1[0] 和 list2[0] 标识不相同,list1[0]标识为:',id(list1[0]),'list2[0]标识为:',id(list2[0]))
输出结果为:
list1[0] 和 list2[0] 标识相同,标识为: 1375086286224
(4)元组的标识是跟着变量名的,变量名不一样,标识也不一样,上例子:
tuple1 = (10000,20000,30000) tuple2 = (10000,12000,15000) if tuple1[0] is tuple2[0]: print('tuple1[0] 和 tuple2[0] 标识相同,标识为:',id(tuple1[0])) else: print('tuple1[0] 和 tuple2[0] 标识不相同,tuple1[0] 标识为:',id(tuple1[0]),'tuple2[0]标识为:',id(tuple2[0]))
输出结果为:
tuple1[0] 和 tuple2[0] 标识不相同,tuple1[0] 标识为: 1375086286384 tuple2[0]标识为: 1375086286480
(5)字典和列表是一样的,只要是列表项数值一样,那么标识也是一样的。例子如下:
dict1 = {1:10000,2:20000,3:30000} dict2 = {1:10000,2:12000,3:15000} if dict1[1] is tuple2[1]: print('dict1[1] 和 tuple2[1] 标识相同,标识为:',id(dict1[1])) else: print('dict1[1] 和 tuple2[1] 标识不相同,dict1[1] 标识为:',id(dict1[1]),'tuple2[1] 标识为:',id(dict2[1]))
输出结果为:
dict1[1] 和 tuple2[1] 标识不相同,dict1[1] 标识为: 1375086286224 tuple2[1] 标识为: 1375086286224
代码菇凉
看了 "is" 和 "==" 的区别,我有了进一步的了解。
is 是比较对象是否相同(is 表示对象标识符即 object identity),即用 id() 函数查看的地址是否相同,如果相同则返回 True,如果不同则返回 False。is 不能被重载。
== 是比较两个对象的值是否相等,此操作符内部调用的是 __eq__() 方法。所以 a==b 等效于a.__eq__(b),所以 = 可以被重载。