Python is 和 == 的区别

原文: Python3 运算符

   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),所以 = 可以被重载。