Python的核心数据类型有:数字,字符串,列表,字典,元组,文件等。
对象类型 | 例子 | 可变性 |
数字 | 345,3.45, 345L,3+4j | 不可变 |
字符串 | ‘spam',“eggs” | 不可变 |
列表 | [1, ['a', 'b'], 2] | 可变 |
字典 | {1: 'a', '2': 'b', 'food': 'spam'} | 可变 |
元组 | (1, 2, 'spam) | 不可变 |
文件 | myFile = open('data', 'r + w') |
可变与不可变
- Python中变量是不需要事先声明的,这一点不同于C语言,而这与其内部对变量和对象的存储相关。在Python中变量名和对象是分开存储的,变量实际上是字典,以变量名为键映射对象的引用。赋值操作如str = 'abc',是将对象'abc'的引用赋给str这个变量名。
- 由于变量存储的是对象的引用,于是就会出现多个变量指向同一个引用的问题。但是对象存在可变的与不可变的,如果变量引用的是不可变的,那么修改该变量并不会影响其他变量,实际上这时两个变量已经指向不同的对象了,因为修改的时候是生成新的对象,然后将新的引用赋给变量。
内置函数vars(),返回在该函数调用前存在的变量组成的字典,当然还会包含一些系统预先定义的变量。
>>> x = 1 >>> y = 2 >>> vars() {'__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'x': 1, 'y': 2, '__name__': '__main__', '__doc__': None} >>>
数字、字符串和元组是不可变的
- 当执行a = 1,再执行a = 2时,实际上是新建了一个对象2,然后将变量名a的引用指向了对象2。
- 字符串是不可变的,不能执行str[i] = 'c'的操作。
- 元组类似于列表,但是约定其是不可变的,也就是不能修改其元素的值,这样可以避免不同变量引用同一元组,而造成元组被修改。
列表和字典是可变的
- 列表实际上是用一维数组来存储对应的元素的对象的引用,修改列表实际上修改的是引用。
- 字典的键类似于变量名,其映射的值,类似于对象,对其修改时也是类似的修改引用。字典没有顺序的概念,意思是无法通过偏移来访问其元素,在存储时也是类似于列表用一维数组来存储键,只是采用了哈希算法,为的是按键查找时速度更快。
分片
- 对于字符串、列表和元组都支持分片操作,分片可以批量操作元素。如果是可变对象,分片是一个新对象,对分片的操作不会改变原先序列,如果是可变对象,对分片的操作是在源处修改。
- 分片L[i:j]提取对应部分作为一个序列,表示从下标为i开始到下标为j结束,不包含j。
- 分片的边界默认是0和序列的长度,如L[:j],表示从0~j-1,L[i:],表示从i开始的所有元素,L[:]表示更个序列。
- 分片的下标支持负数,负数表示从右往左数,如-1表示从右往左数第1个,-2表示从右往左数第2个,如L[:-1] == L[:n],L[-3:-1]。
扩展分片
- 扩展分片增加了第3个限制值,其基本形式为X[i:j:k],意思是索引X对象中的元素,从偏移为i(含i)直到偏移为j-1(含j-1),每隔k个元素索引一次。第三个限制值k默认为1,可以为负数,负数表示从右往左索引元素,即从偏移i(含i)开始往左索引直到偏移为j+1(含j+1)的元素。
例如,X[1:10:2] 会取出偏移为1, 3, 5, 7, 9的元素
X[:10:2] 会取出偏移为0, 2, 4, 6, 8的元素
当k为负数时,从右往左索引元素。
>>> s = 'abcdefg' >>> s[::-1] 'gfedcba' >>> s[5:1:-1] 'fedc'
s[5:1:-1]表示从偏移5从右往左索引,直到偏移2的序列。