列表
A= [1,2,3,4,5,6,7,8,9,10]
B = A
A[0] = 0
print(A,B)
将A列表直接赋值给B,其实是变量的引用,A和B指向同一个地址,当A发生改变时,B也变了,同理B变了,A也变
A= [1,2,3,4,5,6,7,8,9,10]
B= A.copy()
A[0] = 0
print(B)
用copy是相当于从新创建了一个列表,然后将原来列表的内容,复制到新的列表,此时A和B是分开的,A改变不会影响B
A=[[1,2,3],[1,2,3],[1,2,3]]
B = A.copy()
A[1][1] = 4
print(B)
如果是嵌套列表,那么此时用copy生成一个新的列表B,如果我们修改了A里面的子元素,那么B里面的元素也会跟着修改;原因就是copy是前拷贝,他只拷贝外层对象,如果包含嵌套对象的话,他还是拷贝对象的引用
A=[[1,2,3],[1,2,3],[1,2,3]]
B = copy.deepcopy(A)
A[1][1] = 4
print(B)
copy模块的deepcopy方法可以实现深拷贝,在拷贝外层对象的时候,也把嵌套对象,重新存了一份
列表推导式
[表达式 for 变量 in 列表]
A=[[1,2,3],
[1,2,3],
[1,2,3]]
#获取A列表斜对角的值
B = [A[i][i] for i in range(3)]
C = [A[i][len(A)-i-1]for i in range(len(A))]
print(C)
#生成一个元素为dd', 'ss', 'dd', 'ss', 'dd', 'ss的列表
y = [c*2 for c in "dsdsds"
#返回dsdds的ASCII码
code = [ord(c) for c in "dsdds"]
列表推导式和循环从结果上来看是一样的,但是过程有很大区别,循环是一个一个的替换原来列表的内容,而列表推导式是创建一个新的列表,然后将原来列表的名字附给这个新的列表
[表达式 for 变量 in 列表 if 条件]
#提取10以内的偶数
even = [i for i in range(10) if i % 2==0]
print(even)
#提取第一个字母是d的字符串
word = ["dadad","dffsdf","fdfdfd","gfsds"]
w = [w for w in word if w[0] == "d"]
print(w)
[表达式 for 变量 in 列表 for 变量 in 列表]嵌套
A = [[1,2,3],[2,3,4],[3,4,5]]
B = [w for rol in A for w in rol]
ver = [x + y for x in "sdf" for y in "zxc"]
print(ver)
[表达式 for 变量 in 列表 if 条件 for 变量 in 列表 if 条件]
ver = [[x,y] for x in range(10) if x % 2 == 0 for y in range(10) if y % 3 == 0]
print(ver)
用循环实现:
_ = []
for i in range(10):
if i % 2 == 0:
for j in range(10):
if j % 3 == 0:
_.append([i,j])
print(_)
结果:
最后,虽然列表推导式运行速度比循环快而且更简洁,但是对于复杂的程序如果我们仍使用列表推导式,将会提高后期的阅读和维护成本,所以要自己拿捏好度
元组
Python 的元组与列表类似,不同之处在于元组的元素不能修改。
元组使用小括号,列表使用方括号。
元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可
A = (1,2,3,4,5,61)
print(A)
元组也可以使用切片:
print(A[:])
print(A[2:])
print(A[:3])
因为元组不可以修改,所以对于元组只有查的函数
count:查出元组内某个元素的个数
index:查出元组内某个元素的下标
A = (1,2,3,4,5,61,1,2,1,1)
print(A.count(1))
print(A.index(1))
元组也适用+和*
+:相当于生成一个包含A和B内所有元素的元组
*:相当于把A元组内的元素复制n遍然后附给一个新元组
A = (1,2,3,4,5,61,1,2,1,1)
B = (1,2,3,4,5,61,1,2)
print(A+B)
print(A*3)
元组也支持遍历:
A = (1,2,3,4,5,61,1,2,1,1)
for i in A:
print(i)
生成只有一个元素的元组(元素后面必须带逗号,不然就是一个int类型了)
_ = (2,)
元组的打包和解包(列表和字符串也可以,即任何序列类都可以)
打包:生成一个元组
解包:将元组内的每个元素都拿出来
注意:赋值号左侧的参数个数必须和序列里面元素的个数一致,不然就会报错
python的多重赋值其实就是利用元组的打包和解包实现的:首先通过元组进行打包,然后再解包
A= (2,3,4)
#打包
x,y,z = A
#解包
print(x,y,z)
元组内的元素如果指向一个可变的列表,那么列表内的元素是可变的
A=([1,2,3],[4,5,6])
A[0][1] = 9
print(A)