当前位置 博文首页 > momoda118的博客:python不可变类型和可变类型(为什么我的列表/

    momoda118的博客:python不可变类型和可变类型(为什么我的列表/

    作者:[db:作者] 时间:2021-08-16 22:05

    大家在刚接触或平时使用python的时候,可能都会出现类似如下的情况:

    a = [1, 2]
    b=a
    print('改变b前,a的值:',a)
    b[0] = 2
    print('改变b后,a的值:',a)
    print('b:', b)
    --------输出结果-------------
    	改变b前,a的值: [1, 2]
    	改变b后,a的值: [2, 2] # 没有改变a,a不应该等于[1,2]吗? 为什么等于[2,2]了
    	b: [2, 2]
    

    为什么我只给b赋值,但a却被改变了?

    a不应该等于[1,2]吗!!!

    这里就需要了解python中可变类型和不可变类型的区别了
    在上述代码中,虽然a的值赋值给了b,但由于a是一个可变类型,赋予b的值实际上是a的内存地址,这个时候b和a共用一个内存地址,在改变b值的操作后,由于内存地址未发生变化,所以a的值也相当于被改变了。
    python中可变类型有三种:list, dict,set
    那如何让改变b的时候,不改变a呢?
    可以使用深拷贝:

    import copy
    
    a = [1, 2]
    b = copy.copy(a)  # 深拷贝a
    print('改变b前,a的值:', a)
    b[0] = 2
    print('改变b后,a的值:', a)
    print('b:', b)
    --------输出结果-------------
    	改变b前,a的值: [1, 2]
    	改变b后,a的值: [1, 2]
    	b: [2, 2]
    
    

    如果是不可变类型(string,int,float,tuple),则不会出现上述情况

    b = a = 2
    print('改变b前,a的值:', a)
    b = 1
    print('改变b后,a的值:', a)
    print('b:', b)
    --------输出结果-------------
    	改变b前,a的值: 2
    	改变b后,a的值: 2
    	b: 1
    
    cs