python中的is, ==与对象的相等判断
在java中,对于两个对象啊a,b,若a==b表示,a和b不仅值相等,而且指向同一内存位置,若仅仅比较值相等,应该用equals。而在python中对应上述两者的是‘is’ 和‘==’。
(1) python中的基本类型的is判断
需要注意的是,对于python中的基本类型,如str,数值类型(int,long,float,complex)不要用is来做相等判断,下面给出is判断为False的例子:
str_123 = '123'
print 'id("123"):{}'.format(id(str_123))
itostr_123 = str(123)
print 'id(str(123)):{}'.format(id(itostr_123)) p1 = 256 + 1
p2 = 257
print 'id(p1):{}'.format(id(p1))
print 'id(p2):{}'.format(id(p2))
其结果是:
id(""):40187864
id(str(123)):40121608
id(p1):40214096
id(p2):40214744
str或者是int变量的id并不相同。
(2) python中对象的相等判断
简单的对于对象的相等判断方式有两种:
例如,自定义类Person:
class GenderEnum(object):
MALE = 'MALE'
FEMALE = 'FEMALE' class Person(object):
def __init__(self, name, gender=GenderEnum.MALE, age=0):
self.name = name
self.gender = gender
self.age = age def __repr__(self):
type('str')
return '<Person %r %r %r>' % (self.name, self.gender, self.age)
若用==做如下判断:
p1 = Person('tom', age=3)
p2 = Person('tom', age=3)
p3 = Person('jerry', age=5)
print 'id(p1):{}'.format(id(p1))
print 'id(p2):{}'.format(id(p2))
print 'id(p3):{}'.format(id(p3))
print p1 == p2
print p1 == p3
结果:
id(p1):39445784
id(p2):39445840
id(p3):39445896
False
False
p1,与p2的值虽然相同,但是地址不同。
想要判断值相等,第一个方法是直接用instance.__dict__来判断:
p1.__dict__ == p2.__dict__
另外一种方法是在Person class中加上自定义的__eq__函数:
def __eq__(self, other):
if self.name != other.name:
return False
if self.gender != other.gender:
return False
if self.age != other.age:
return False
return True
python中的is, ==与对象的相等判断的更多相关文章
- python中的类,对象,方法,属性等介绍
注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
- Python中的变量引用对象需注意的几点
Python中的变量引用对象需注意的几点 分类:Python (55) (0) 普通引用: Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须 ...
- Python中的可迭代对象
Python中的可迭代对象有:列表.元组.字典.字符串:常结合for循环使用: 判断一个对象是不是可迭代对象: from collections import Iterable isinstanc ...
- 第二章python中的一切皆对象
1.函数和类也是对象,属于python的一等公民 赋值给一个变量 可以添加到集合对象之中 可以作为参数传递给函数 可以当作函数的返回值 def ask(name="ask_wzh" ...
- python中的一切皆对象
python中一切皆对象是这个语言灵活的根本.函数和类也是对象,属于python的一等公民.包括代码包和模块也都是对象.python的面向对象更加彻底. 可以赋值给一个变量可以添加到集合对象中可以作为 ...
- 初识python中的类与对象
这篇博客的路线是由深入浅,所以尽管图画的花花绿绿的很好看,但是请先关注我的文字,因为初接触类的小伙伴直接看类的实现可能会觉得难度大,只要耐着性子看下去,就会有一种“拨开迷雾看未来”的感觉了. 一.py ...
- 实习小记-python中不可哈希对象设置为可哈希对象
在这篇之前,我又专门翻译过官方python3.3的可哈希对象文档,大家可以先参考一下: 实习小记-python中可哈希对象是个啥?what is hashable object in python? ...
- 一、python中的一切皆对象
1.函数和类是对象,是Python中的一级公民 (1)将函数和类赋值给一个变量 将函数或类赋值给一个变量,就可以把该变量当成函数或类来使用 def ask(name): print(name) cla ...
- python中多重继承与获取对象
1.python中多重继承 除了从一个父类继承外,Python允许从多个父类继承,称为多重继承. 多重继承的继承链就不是一棵树了,它像这样: class A(object): def __init__ ...
随机推荐
- UIViewContentMode的各种效果
UIViewContentMode的各种效果: 首先它是枚举类型的数据,表示为下所示: typedef enum { UIViewContentModeScaleToFill, ...
- [codeforces/edu3]总结
链接:http://codeforces.com/contest/609 A题: 贪心,从大到小选. B题: 考虑对立面.$C_{sum}^2-\sum{C_{a_i}^2}$ C题: 最终状态是确定 ...
- group by多字段分组
在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据.比如有一个学生选课表,表结构如下: Table: Subject_Selection S ...
- idea一些文件如.xml 文件搜索不到的解决方法
- HDU2833 最短路 floyd
WuKong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 在Linux防火墙上过滤外来的ICMP timestamp
ICMP timestamp请求响应漏洞 解决方案: * 在您的防火墙上过滤外来的ICMP timestamp(类型13)报文以及外出的ICMP timestamp回复报文. 具体解决方式就 ...
- CMDB资产管理系统开发【day27】:cmdb API安全认证
1.API验证分析 API三关验证 客户端和服务端中都存放一份相同的随机字符串,客户端发请求的时候把随机字符串和当前时间进行MD5加密,同时带着当前时间通过请求头发送到API,进入三关验证. 第一关是 ...
- POJ 2823 Sliding Window ST RMQ
Description An array of size n ≤ 106 is given to you. There is a sliding window of size k which is m ...
- 2015/8/31 Python基础(5):字符串
字符串是Python最常见的一种类型.通过在引号间包含字符的方式创建它.Python里单双引号的作用是一致的.Python的对象类型里不存在字符型,一般用单个字符的字符串来使用.Python的字符串是 ...
- C11简洁之道:初始化改进
1. C++98/03初始化 我们先来总结一下C++98/03的各种不同的初始化情况: //普通数组 ] = {, , }; //POD(plain old data) struct A { int ...