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__ ...
随机推荐
- eclipse中支持python
1. 启动eclipse,help-> Install New Software; 2. 点击add 3. 设置Repository name: pydev Location: http://p ...
- udhcpd源码分析3--IP租赁管理
1:重要的结构体 全局链表的成员struct dhcpOfferedAddr *leases 记录了当前租赁出去的IP信息 /* leases.h */ struct dhcpOfferedAddr ...
- POJ 3111 二分
K Best Time Limit: 8000MS Memory Limit: 65536K Total Submissions: 10507 Accepted: 2709 Case Time ...
- [LeetCode] 11. Container With Most Water ☆☆
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...
- LightOJ 1340 - Story of Tomisu Ghost 阶乘分解素因子
http://www.lightoj.com/volume_showproblem.php?problem=1340 题意:问n!在b进制下至少有t个后缀零,求最大的b. 思路:很容易想到一个数通过分 ...
- C11简洁之道:lambda表达式
1. 定义 lambda表达式是C++11非常重要也是很常用的特性之一,来源于函数式编程的概念,也是现代编程语言的一个特点.它有如下特点: 声明式编程风格:就地匿名定义目标函数或者函数,不需要额外写 ...
- 【设计模式】 模式PK:策略模式VS状态模式
1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...
- JAVA嵌套类:静态嵌套类和非静态嵌套类
1.内部类定义 内部类在维基百科的定义为: 面向对象编程中,内部类(又叫做嵌套类)是在另一个类或者接口中进行声明的类.内部类不同于子类(subclass).(译者注:wiki的注解有误,内部类和嵌套 ...
- ios应用里面进入app store 下载界面
转自:http://blog.csdn.net/diyagoanyhacker/article/details/6654838 在IOS应用里直接打开app store 评论页面的方法: [[UIAp ...
- Java 对象排序详解
很难想象有Java开发人员不曾使用过Collection框架.在Collection框架中,主要使用的类是来自List接口中的ArrayList,以及来自Set接口的HashSet.TreeSet,我 ...