Python学习笔记--列表的相关操作
程序员文章站
2024-01-07 11:39:58
...
以下内容均为本人学习笔记,若有不当,欢迎指出
列表
Python中的列表对比于C++中的数组来说更灵活一些,可以包含不同类型的对象
- 特点一:
使用切片操作类似于字符串的切片操作,但是还可以改变元素
a = [1, 2, 3, 4, 5]
a[0] = 9
print a
执行结果:
[9, 2, 3, 4, 5]
- appen:追加元素
a = [1, 2]
a.append(8)
print a
执行结果:
[1, 2, 8]
- 删除指定下标的元素
a = [0, 1, 2]
del a[2]
print a
执行结果:
[0, 1]
- 按值删除元素
a = [1, 2, 3]
a.remove(3)
print a
执行结果:
[1, 2]
- 列表的比较操作:
== 和 != 是所有元素都符合
< , <= , > , >= 是两个列表从第一个个元素开始比较,知道某一元素比出结果
a = ['abc', 123]
b = ['bcd', 000]
c = [123, 'abc']
print a < b
print b > c
执行结果:
(python3的话不同类型是不可以比较大小的)
True
True
- extend 连接操作
a = [1, 2]
a.extend([3, 4])
print a
列表不支持+=操作,这里的连接操作相当于+=操作
- 排序操作
python中对序列有一个内建函数sorted()
支持排序,但是会生成一个新的有序序列
列表自身有一个成员函数sort()
,是基于自己本身修改,并不会生成新的对象
a = [5, 3, 2, 1]
a.sort()
print a
执行结果:
[1, 2, 3, 5]
- 基于列表实现堆栈
stack
a = []
a.append(8) # push操作
a.pop() # pop操作
print a[-1] # top操作
queue
a = []
a.appen(3) # push操作
a.pop(0) # pop操作
print a[0] # front操作
-
列表的深浅拷贝问题
这是一个比较难理解的问题
先来看这个例子:
a = [3, [3, 4]]
b = a # 直接赋值法
c = list(a) # 使用工厂函数list()
d = a[:] # 切片
# 打印出各个列表的id
print id(a)
print id(b)
print id(c)
print id(d)
# 将a 中的**数字**元素进行修改之后,查看各个列表是否变化
a[0] = 1
print a
print b
print c
print d
# 将a 中的**列表元素**进行修改后,查看各个列表是否变化
a[1][0] = 1000
print a
print b
print c
print d
print id(a[1])
print id(b[1])
print id(c[1])
print id(d[1])
执行结果:
140570408003272
140570408003272
140570408021888
140570408020808
[1, [3, 4]]
[1, [3, 4]]
[3, [3, 4]]
[3, [3, 4]]
[1, [1000, 4]]
[1, [1000, 4]]
[3, [1000, 4]]
[3, [1000, 4]]
140570408054864
140570408054864
140570408054864
140570408054864
我们发现
- a 和 b 是同一个对象(id 相同,修改任何类型的值,都是同变化的)
- c 和 d 与 a 不是同一个对象(id 不相同)
- c 和 d 在修改列表中的列表元素时也跟着变化了
-
b 、c、d 中的列表元素的 id 都和 a 相同
接下分析:
浅拷贝是:拷贝的新对象中的子对象和原来对象里面的子对象不是同一个对象(id 不相同)
深拷贝是:拷贝的新对象,同时新对象中的子对象也是重新创建了一份新的深拷贝对象
总结:上面的3种拷贝方法,都是浅拷贝 深拷贝通过copy.deepcopy来完成
import copy
a = [9, [2, 3]]
b = copy.deepcopy(a)
print a
print b
print id(a)
print id(b)
print id(a[1])
print id(b[1])
执行结果:
[9, [2, 3]]
[9, [2, 3]]
140435273709256
140435273711488
140435273710408
140435273747344
我们看到 a[1] 和 b[1] 不再是同一个对象了
- 不止是列表,其他容器,例如元组,字典也存在类似的深拷贝问题,原理和列表相同
- 但是也并不是说,调用deepcopy就一定会执行深拷贝,Python解释器自己会根据具体的情况
例如,下面的例子
import copy
a = (100, 'cccc')
b = copy.deepcopy(a)
print a
print b
print id(a)
print id(b)
print id(a[1])
print id(b[1])
执行结果:
发现并没有进行深拷贝
(100, 'cccc')
(100, 'cccc')
140527276675872
140527276675872
140527276804064
140527276804064
其实也很好理解,元组是不可修改类型,深拷贝是为了防止修改之后影响其他对象,元组不存在这个问题,深拷贝的话比较浪费资源。
完。