# 演示python中的可变类型(如list)和不可变类型(tuple),在函数传参(传入传出)中的不同
def changelist(input_list):
output_list = input_list
output_list[0] = 65536 # 修改list中的元素值
output_list.pop() # 减少元素
output_list.append(648) # 增加元素
return output_list
list_1 = [1,2,3,4,5]
# print(type(list_1))
list_2 = changelist(list_1)
print('list 1: {}'.format(list_1))
print('list 2: {}'.format(list_2)) # list 1 和 list 2 相同,都被修改了
def changeanotherlist(input_list):
output_list = []
for i in range(0,len(input_list)):
output_list.append(input_list[i])
output_list[0] = 648 # 修改list中的元素值
output_list.pop() # 减少元素
output_list.append(65536) # 增加元素
return output_list
list_3 = changeanotherlist(list_1)
print('list 1: {}'.format(list_1))
print('list 3: {}'.format(list_3)) # list 3 改变,list 1 得到保护
def changecopylist(input_list):
output_list = input_list.copy()
output_list[0] = 123
output_list.pop()
output_list.append(321)
return output_list
list_4 = changecopylist(list_1)
print('list 1: {}'.format(list_1))
print('list 4: {}'.format(list_4)) # list 4改变,list 1 得到保护
# 总结:对于单层list,1-手动拷贝、2-.copy()方法,都可以创建副本,保护原list不被修改
# 然而多层list的情况又不一样
def changemulist(input_mulist):
output_mulist = input_mulist.copy()
output_mulist[0][0] = 6
output_mulist.pop()
output_mulist.append([8,8])
return output_mulist
mulist_1 = [[0,0],[1,1],[2,2],[3,3]]
mulist_2 = changemulist(mulist_1)
print('mulist 1: {}'.format(mulist_1)) # mulist 1: [[6, 0], [1, 1], [2, 2], [3, 3]]
print('mulist 2: {}'.format(mulist_2)) # mulist 2: [[6, 0], [1, 1], [2, 2], [8, 8]]
# 总结:由于是浅拷贝,内层的元素会被一起修改
import copy
def mulistchange(input_mulist):
output_mulist = copy.deepcopy(input_mulist)
output_mulist[0][0] = 9
output_mulist.pop()
output_mulist.append([0,0])
return output_mulist
mulist_3 = mulistchange(mulist_1)
print('mulist 1: {}'.format(mulist_1)) # mulist 1: [[6, 0], [1, 1], [2, 2], [3, 3]]
print('mulist 3: {}'.format(mulist_3)) # mulist 3: [[9, 0], [1, 1], [2, 2], [0, 0]]
# 总结:copy.deepcopy可以实现完全拷贝(深拷贝),使得原多层list不被修改
# 附:如何避免踩坑?可以考虑不可变类型tuple
tuple_1 = (1,2,3,4,5)
print(type(tuple_1))
mutuple_1 = ((1,1),(2,2),(3,3),(4,4),(5,5))
mutuple_2 = ([1,1],[2,2],[3,3],[4,4],[5,5])
print(type(mutuple_1))
def changetuple(input_tuple):
output_list = list(input_tuple)
output_list[0] = 123
output_list.pop()
output_list.append(321)
return output_list
# 多层怎么办?
tuple_2 = changetuple(tuple_1)
print('tuple 1: {}'.format(tuple_1)) # tuple 1: (1, 2, 3, 4, 5)
print('tuple 2: {}'.format(tuple_2)) # tuple 2: [123, 2, 3, 4, 321]
def changemutuple(input_mutuple):
output_list = list(input_mutuple)
# print(output_list) #
output_list[0][0] = 123
output_list.pop()
output_list.append(321)
return output_list
mutuple_4 = changemutuple(mutuple_2)
print('mutuple 2: {}'.format(mutuple_2)) # mutuple 2: ([123, 1], [2, 2], [3, 3], [4, 4], [5, 5])
print('mutuple 4: {}'.format(mutuple_4)) # mutuple 4: [[123, 1], [2, 2], [3, 3], [4, 4], 321]
# 对于多层,还是不行
# mutuple_3 = changemutuple(mutuple_1) # 报错:list(mutuple_1) 为 [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)],内层元素不可变