-
身份:每个对象一唯一身份标识,可使用内建函数id()查看该值(可以认为这个值是该对象的内在地址)
-
类型:对象的类型决定了对象(可以保存什么类型的值,进行什么样的操作,遵循什么样的规则),可以使用内建函数type()查看(对象的类型也是一个对象,因此type()返回的是一个对象,而不是字符串)
-
值:对象表示的数据项
-
数字(分为几个子类型,有三个是整型)
Integer 整型
Boolean 布尔型
Long integer 长整型
Floating point real number 浮点型
Complex number 复数型
-
String 字符串
-
List 列表
-
Tuple 元组
-
Dictionary 字典
-
类型
-
Null对象(None)
-
文件
-
集合/固定集合
-
函数/方法
-
模块
-
类
下面主要说明Type和None类型,其它的后面会讨论。
1
2
|
>>>
type
(
42
)
<
type
'int'
>
|
1
2
|
>>>
type
(
type
(
42
))
<
type
'type'
>
|
1
2
|
>>>
type
(
type
(
type
(
42
)))
<
type
'type'
>
|
-
所有类型对象的类型都是type,它也是所有Python类型的根和所有Python标准类的默认元类(metaclass)
-
在Python中,类就是类型,实例是对应类型的对象(类比42的例子,42属于数字类型,它是数字类型构造值后的一个数字对象,或者说42是类int的一个实例对象,因为现在类型就是类)
1
2
3
|
>>>
None
>>>
type
(
None
)
<
type
'NoneType'
>
|
-
每个对象天生具有布尔True或False值
-
空对象 值为零的任何数字或者Null对象的布尔值都是False
-
用户创建的类实例如果定义了nonzero(__nonzero__())或length(__len__())且值为0,那么它们的布尔值就是False
-
代码
-
帧
-
跟踪记录
-
切片
-
省略
-
Xrange
-
指向上一帧的链接
-
正在被执行的代码对象
-
本地及全局名称空间字典及当前指令等
1
2
3
4
|
>>> Ellipsis
Ellipsis
>>>
type
(Ellipsis)
<
type
'ellipsis'
>
|
1
2
|
>>>
3
<
4
<
7
True
|
1
2
|
>>>
3
<
4
and
4
<
7
True
|
-
相同值,指向相同对象
1
2
3
4
5
|
>>> foo1
=
foo2
=
4.3
>>> a
is
b
True
>>>
id
(a)
=
=
id
(b)
True
|
-
值相同,指向不同对象
1
2
3
4
5
6
7
8
|
>>> foo1
=
4.3
>>> foo2
=
1.3
+
3.0
>>> foo1
is
foo2
False
>>>
id
(foo1)
18024120
>>>
id
(foo2)
18024048
|
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> a
=
1
>>>
id
(a)
17953112
>>> b
=
1
>>>
id
(b)
17953112
>>> c
=
1.0
>>>
id
(c)
18024096
>>> d
=
1.0
>>>
id
(d)
18024072
|
1
2
3
4
5
6
|
>>> e
=
336
>>>
id
(e)
18554008
>>> f
=
336
>>>
id
(f)
18601504
|
-
not
-
and
-
or
-
cmp(obj1, obj2):大于返回负数,小于返回正数,等于返回0
-
repr(obj)或`obj`:返回一个对象的字符串表示
-
str(obj):返回对象适合可读性好的字符串表示
-
type(obj):得到一个对象的类型,并返回相应的类型对象(type对象,与type类型对象不同)
1
2
3
4
5
6
|
>>>
type
(
4
)
<
type
'int'
>
>>>
type
(
'Hello World!'
)
<
type
'str'
>
>>>
type
(
type
(
4
))
<
type
'type'
>
|
1
2
3
4
5
6
7
8
9
10
|
>>>
cmp
(
1
,
2
)
-
1
>>>
cmp
(
2
,
1
)
1
>>>
cmp
(
2
,
2
)
0
>>>
cmp
(
'abc'
,
'xyz'
)
-
1
>>>
cmp
(
'abc'
,
'abc'
)
0
|
-
str()
str()函数得到的字符串表示可读性比较好,适合用于print输出,大多数情况下都无法将该字符串表示通过eval()求值来得到原来的对象(当然,简单的就除外了)。
1
2
3
4
5
6
7
8
|
>>>
str
(
1
)
'1'
>>>
eval
(
str
(
1
))
1
>>>
str
([
1
,
2
,
3
])
'[1, 2, 3]'
>>>
eval
(
str
([
1
,
2
,
3
]))
[
1
,
2
,
3
]
|
-
repr()或``
返回一个对象的“官方”字符串表示,也就是说大多数情况下,都可以将字符串通过eval()求值来得到原来的对象(当然,也有例外的情况)。
1
2
3
4
5
6
7
8
9
10
11
|
>>>
repr
([
1
,
2
,
3
])
'[1, 2, 3]'
>>>
eval
(
repr
([
1
,
2
,
3
]))
[
1
,
2
,
3
]
>>>
eval
(
repr
(
type
(
42
)))
Traceback (most recent call last):
File
"<stdin>"
, line
1
,
in
<module>
File
"<string>"
, line
1
<
type
'int'
>
^
SyntaxError: invalid syntax
|
-
type()
type()用于返回一个对象的类型,它的返回值是一个类型对象,这些前面已经有所提及,再给出下面的例子:
1
2
3
4
5
6
7
8
|
>>>
class
Foo:
pass
...
>>>
class
foo(
object
):
pass
...
>>>
type
(Foo)
<
type
'classobj'
>
>>>
type
(foo)
<
type
'type'
>
|
-
isinstance()
如果需要判断一个对象的类型,可以使用下面的方法:
1
2
3
|
>>>
from
types
import
IntType
>>>
type
(
42
)
=
=
IntType
True
|
1
2
3
4
5
|
>>>
if
isinstance
(
42
, (
float
)):
print
'OK'
...
>>>
if
isinstance
(
42
, (
float
,
int
)):
print
'OK'
...
OK
|
-
int(), long(), float(), complex()
-
str(), unicode, basestring()
-
list(), tuple()
-
type()
-
基本:是因为这些类型都是Python提供的标准呀核心类型
-
内建:是因为这些类型是Python默认就提供的
-
数据:是因为他们用于一般数据存储
-
对象:是因为对象是数据和功能的默认抽象
-
原始:是因为这些类型提供的是最底层的粒度数据存储
-
类型:是因为他们就是数据类型
-
原子/标量存储:能保存单个字面对象的类型
-
容器存储:可容纳多个对象的类型
存储模型 |
|
分类 | Python类型 |
标量/原子类型 | 数值(所有的数值类型),字符串(全部是文字) |
容器类型 | 列表 元组 字典 |
-
可变类型:对象的值可以被更新
-
不可变类型:对象的值不可以被更改
更新模型 |
|
分类 | Python类型 |
可变类型 | 列表 字典 |
不可变类型 | 数字 字符串 元组 |
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> a
=
3
>>>
id
(a)
17953064
>>> a
=
6
>>>
id
(a)
17952992
>>> x
=
'abc'
>>>
id
(x)
140407360100672
>>> x
=
'change'
>>>
id
(x)
140407359514784
|
1
2
3
4
5
6
|
>>> aList
=
[
1
,
2
,
3
]
>>>
id
(aList)
140407359478888
>>> aList.append(
'change'
)
>>>
id
(aList)
140407359478888
|
-
直接存取:非容器类型可以直接访问(对于字符串,会有些特别,所以不会属于此类)
-
顺序/序列:也就是可以通过使用切片(slice)的方式来进行访问
-
映射:元素是无序存放的,但可以通过键值对的方式进行访问
访问模型 |
|
分类 | Python类型 |
直接访问 | 数字 |
顺序访问 | 字符串 列表 元组 |
映射访问 | 字典 |
标准类型分类 |
|||
数据类型 | 存储模型 | 更新模型 | 访问模型 |
数字 | 标量 | 不可更改 | 直接访问 |
字符串 | 标量 | 不可更改 | 顺序访问 |
列表 | 容器 | 可更改 | 顺序访问 |
元组 | 容器 | 不可更改 | 顺序访问 |
字典 | 容器 | 可更改 | 映射访问 |