首先来理解一个通俗的含义,什么是对象
?其实对象无论在什么语言里面,比如C++
,Python
里面都是指一块有类型的内存,对象里面存放着相应的数据
所有的Python对象都有三个特性:身份
,类型
,值
- 身份
:每一个对象都有唯一的一个身份ID来标识自己,就像该对象在内存中的存储地址一样,是唯一的,不可共用的。任何对象的身份标识符都可以用内建函数id()
来得到
x=1
print id(x)
#运行结果:163449008
类型
:因为Python是动态类型的,所以一个对象里面就应该保存该对象的类型来决定该对象而已进行一些什么样的操作。我们可以通过内建函数type()
来得到对象的类型number1 = 1
str1 = ‘Hello World‘
print type(number1)
print type(str1)
#运行结果
#<type ‘int‘>
#<type ‘str‘>
值
:对象表示的数据项,我们在内存里面无差别的存储数据,假如我们在内存里面存储的是1000001
,如果是str
类型,那么就解释为‘A‘
,如果是整形,就解释为65
对象属性: 某些对象有属性,值或者相关联的可执行代码,最常见的属性是函数和方法
Integer
整形Boolean
布尔型Long integer
长整形Floating point real number
浮点型Complex number
复数型String
字符串List
列表Tuple
元组Dictionarry
字典之前提到过,对象通过类型来判断自己可以执行那些操作,那么类型就是用来存储这些操作最佳场所,所以相对于字符串来说,用一个对象来描述一个类型更为适合。
type()
内建函数返回一个type对象,只不过这个对象被以字符串的形式展现出来
print type(10)
print type(type(10))
#运行结果:
#<type ‘int‘>
#<type ‘type‘>
所有类型对象的类型都是type
,它也是所有类型的根和所有Python标准类的默认元类。
None
只有一个值,它不支持任何运算,没有任何内建方法。
每个对象天生具有True
或者False
值。
下面对象的布尔值是False
:
True
对象值的比较会直接返回一个Bool对象,各种类型的对象的比较方法也不同。,数字类型的根据数值的大小和符号比较,字符串按照字符序列进行比较等等
在python里面,一般都是首先在内存中创建一个对象,然后再将这个对象的引用赋值给变量,通过引用对对象进行操作。
x = 3.14 # 创建一个3.14浮点型对象,并将引用赋值给变量x
在许多情况下,一个对象的引用会传给对个变量,为了检测两个变量是否同时指向同一个变量,我们可以用内建函数id()
来比较两个变量指向对象的id
是否相等,或者使用is
或者is not
来比较两个变量是否指向同一个对象
举个栗子:
x = 3.14
y = x
print id(x) == id(y)
print x is y # 和 id(x) == id(y) 一样
print x is not y # 和 id(x) != id(y) 一样
运行结果:
True
True
False
举个栗子:
x = 3.14
y = 1.0 + 2.14
print x is y # 虽然数值相同,但是并不指向同一个对象
运行结果:
False
当多个布尔条件需要通手机进行判断时,Python
为我们提供了下面几个语句
操作符 | 功能 |
---|---|
and | 逻辑与 |
or | 逻辑或 |
not | 逻辑非 |
除了操作符,Python
还提供了一些内建函数用于这些基本信息:
函数 | 功能 |
---|---|
cmp(obj1 , obj2) | 比较两个对象是否相等 |
repr(obj) | 返回一个对象的字符串表示 |
str(obj) | 以可读性良好的为目的返回一个对象的字符串表示 |
type(obj) | 返回对象的类型,返回的类型是一个类型对象 |
type()
内建函数是用来返回一个对象的类型的
print type(1)
print type(‘Hello World‘)
运行结果:
cmp(obj1 , obj2)
是用来比较两个对象的
返回结果 | 比较情形 |
---|---|
正整数 | obj1 > obj2 |
0 | obj1 = obj2 |
负整数 | obj1 < obj2 |
上面比较返回的数值可以理解为 obj1 - obj2
返回的结果
举个栗子:
x, y = 1, 2
print cmp(x, y)
# 运行结果: -1
str1, str2 = ‘xyz‘, ‘abc‘
print cmp(str1, str2)
# 运行结果: 1
上面的两个内建函数str(obj)
和repr(obj)
都是返回一个对象的字符串,但是这两个内建函数又有所不同:
str(obj)
:是用来返回一个可读性好的字符串,面向的用户是程序员repr(obj)
:是用来返回一个Python虚拟机
看得懂的字符串,面向的用户是Python虚拟机
,repr(obj)
返回的字符串可以通过eval(str)
重新求值!即这个式子是成立obj == eval(repe(obj))
总的来说,就是repr(obj)
是对Python比较友好
, str(obj)
是对用户比较友好 , 但是许多情况下str
和repr
的输出都是一样的
print str(1)
print repr(1)
#运行结果:
#1
#1
type(obj)
可以返回任意Python
对象的类型,而不仅局限于标准类型
举个栗子:
对于标准类型
print type(‘‘)
#运行结果: <type ‘str‘>
print type({})
#运行结果: <type ‘dict‘>
对于自定义类型
class Foo:
pass
foo = Foo()
class Bar(object):
pass
bar = Bar()
print type(Foo)
#运行结果 : <type ‘classobj‘>
print type(foo)
#运行结果 : <type ‘instance‘>
print type(Bar)
#运行结果 : <type ‘type‘>
print type(bar)
#运行结果 : <type ‘__main__.Bar‘>
如果现在我们需要确定一个对象的类型,我们可以采用下面的语句进行判断:
#方式1
if type(num) == type(0):...
#方式2
import types
if type(num) == types.IntType:...
#方式3
if type(num) is types.IntType:... # 因为在运行时只有一个对象来表示整形类型
#方式4
from types import IntType
if type(num) is IntType:...
#方式5
if isinstance(num , int):...
有三种不同的模型可以帮助我们对基本类型进行分类:
存储模型里面我们按照类型的对象可以保存多找个对象分为两类:
分类 | python类型 |
---|---|
标量存类型 | 数值(所有数值类型) ,字符串(全部是文字,因为python没有字符类型) |
容器类型 | 列表 , 元组 , 字典 |
在python
里面类型分为可以更改是不可以更改两种类型,运行更改的对象允许他们的值发生变化,而不可更改的对象则不允许他们的值进行更改
分类 | Python类型 |
---|---|
可变类型 | 列表,字典 |
不可变类型 | 数字,字符串 ,元组 |
什么?数字和字符串是不可以更改的?那下面这个更改又是怎么回事?
str1 = ‘Hello World‘
str1 = ‘Hello Moto‘
不错,上面的变量的值的确发生了改变,但是变量不代表对象,第一次赋值是将‘Hello World‘
的引用赋值给str1
,而第二只赋值语句则是将‘Hello Moto‘
的引用赋值给str1
,两个字符串对象‘Hello World‘
和‘Hello Moto‘
的值是没有发生改变的!
在访问模型中共有三种访问方式:直接存取
,顺序
和映射
分类 | Python类型 |
---|---|
直接访问 | 数字 |
顺序访问 | 字符串, 元组, 列表 |
映射访问 | 字典 |
Python
里面有一些常见但是不支持的类型:
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/ii1245712564/article/details/46778919