目录
1、不可变类型:Number,String,Tuple。
无论怎么操作不可变类型,它所含有的元素都不会改变。
以元组为例:
tuple_val = (1,2,3)
new_tuple = tuple_val[1:3] + (4,5,6)
print(new_tuple)
print(tuple_val)
运行结果:
2、可变类型:List,Dict,Set。
注意:虽然Set是可变类型,但是不能更改Set中不可变类型数据。
(1)可变类型的赋值问题:
以List为例:
list_val = ['name','age','gender']
new_list = list_val
list_val.append('height')
print(list_val)
print(new_list)
运行结果:
对于这个结果,我们发现list_val和new_val输出结果相同,因为这两个变量都指向同一个地址,实际上它们是等价的。
有时候我们不希望原来的变量改变,这是我们可以创建一个副本,可使用方法copy()或者切片形式[:],这两者是等价的。
list_val = ['name','age','gender']
new_list1 = list_val.copy()
new_list2 = list_val[:]
list_val.append('height')
print(list_val)
print(new_list1)
print(new_list2)
运行结果:
对于Dict和Set也是如此,只不过创建副本时只能用方法copy()。
(2)循环过程中由可变类型引发的bug:
data = [11,22,33,44,55,66,77]
for i in data:
if i == 33 or i == 44:
data.remove(i)
print(data)
运行结果:
由结果我们知道i=44并没有被删除,这是因为for循环在遍历可变类型元素的时候是通过索引来遍历的。刚开始33,44,55的索引分别是2,3,4;当删除33(此时索引为2)的时候,后面的元素会依次往前,44,55的索引变为2,3,下一次程序会判断索引为3的元素(此时i=55),不符合if条件语句,因此44并没有被删除。
要解决这个bug,我们可以创建一个临时空的列表,用来接收要删除的元素。
data = [11,22,33,44,55,66,77]
list_temp = []
for i in data:
if i == 33 or i == 44:
list_temp.append(i)
print(list_temp)
for j in list_temp:
if j == 33 or j == 44:
data.remove(j)
print(data)
运行结果: