【小白日记】python中list和tuple的可变性测试

# 演示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)],内层元素不可变


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值