@(人工智能编程基础)[Python|图解|列表]
序列类型对象一般都包含一个可遍历的序列,其中并不存储对象本身,而是存储指向对象的引用指针,今天我们来介绍其中最常用序列类型——列表。
比如 a = [1,2,3], [1,2,3]是一个列表对象
a = [1,2,3]
print("a = {}, a的地址:{}, a的类型为:{}, 其中a[0]的地址为:{},a[1]的地址为:{}, a[2]的地址为:{}"
.format(a, id(a),type(a),id(a[0]),id(a[1]),id(a[2])))
运行结果:
a = [1, 2, 3], a的地址:4589867336, a的类型为:, 其中a[0]的地址为:4527752528,a[1]的地址为:4527752560, a[2]的地址为:4527752592
a = [1,2,3]在内存中的大致过程为:
- 在内存中创建了一个长度为3的列表对象,它包含3个引用指针,它的地址为&4589867336,将变量a指向这个列表对象
- 在缓冲池共享区创建数值为1整型对象,地址为&4527752528,列表对象的第一个指针指向它。
- 在缓冲池共享区创建数值为2整型对象,地址为&4527752560,列表对象的第一个指针指向它。
- 在缓冲池共享区创建数值为3整型对象,地址为&4527752592,列表对象的第一个指针指向它。
图解过程如下:
改变是可变类型对象,它的可变体现在两个方面:
- 列表中引用指针指向的对象地址可以改变,
- 列表的长度可以改变。
改变列表的某个值,其实是将列表中的引用指针指向了新的对象,比如a[2] = 300
a[2] = 300 #列表是可变对象,可以修改其中元素指向的对象的地址
print("a = {}, a的地址:{}, a的类型为:{}, 其中a[0]的地址为:{},a[1]的地址为:{}, a[2]的地址为:{}"
.format(a, id(a),type(a),id(a[0]),id(a[1]),id(a[2])))
运行结果:
a = [1, 2, 300], a的地址:4589867336, a的类型为:, 其中a[0]的地址为:4527752528,a[1]的地址为:4527752560, a[2]的地址为:4589924560
过程如下:
- 在内存中生成了一个数值为300的整型对象,它的地址为&4589924560,将列表的第三个索引指针指向这个整型对象。
- 列表对象本身的地址并没有改变&4589867336,它还是上面生成的那个列表对象,不过它的值已经改变了。
如图示:
列表的可变性还体现在长度可变,可增长,也可缩短。
a.append(500) #列表的长度也可以改变
print("a = {}, a的地址:{}, a的类型为:{}, 其中a[0]的地址为:{},a[1]的地址为:{}, a[2]的地址为:{}"
.format(a, id(a),type(a),id(a[0]),id(a[1]),id(a[2])))
运行结果:
a = [1, 2, 300, 500], a的地址:4589867336, a的类型为:, 其中a[0]的地址为:4527752528,a[1]的地址为:4527752560, a[2]的地址为:4589924560
a.append(500) 大致过程:
- 在内存中生成一个数值为500的整型对象
- 列表后面追加了一个引用指针,它指向了上面生成的数值为500的整型对象。
- 列表对象本身的地址并没有改变&4589867336,它还是上面生成的那个列表对象,不过它的长度已经改变了。
如图所示:
总结:
1. 列表是序列类容器类对象,它不存放对象,而是存放指向对象的指针。
2. 这类序列类型还包括元组,集合,字典和字符串。
2. 列表是可变类型对象,它不仅指针可变,长度也可变。