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