python初学一(深浅copy)

一、可变数据与不可变数据类型的区别:

         1、不可变数据类型(地址改变):

                         不可变数据类型指的是不可变对象在进行重新赋值的时候,实际上是将原始值丢弃,将变量指向一个新值,即内存地址会发生改变。

a = 1
b = 1
print(id(a),id(b))    # 查看原地址
b = a         
print(id(b))         
a = 2 
print(id(a))        # 地址发生改变
print(id(2))

#  答案:1512792224 1512792224
        1512792224
        1512792256
        1512792256

         2、可变数据类型(地址不会变):

                         可变数据类型实质上是指更改可变对象中的子对象后,该数据类型的内存地址没有发生变化。

# 赋值修改
list1 = [1,2,4]
print(id(list1))      
list1[1] = 'a'        
print(id(list1))      # id 不变



list1 = [1,2,3,4]
list2 = []                      
list2.append(list1)
print(list2)
list1.append(55)                   
print(list2)                         #  重点理解记忆
    答案:
              [[1, 2, 3, 4]]
              [[1, 2, 3, 4, 55]]       # 改变list1,list2会改变,因为列表时可变元素,地址没有变。

二、直接赋值、浅拷贝、深拷贝的区别(只说可变数据类型):

         1、直接赋值:

                      注意其与浅拷贝的区别。append属于操作第一层元素。

list1 = [1,2,3,4]
list2 = list1  # 相当于房间有两个门牌号,房间本身如果变化,另一个门牌号也会变化。(与浅拷贝的区别是  就算改变第一层的元素也会跟随变化)
list1.append('aaaaaa')
print(id(list1),id(list2))   # 1568338730760 1568338730760


          2、浅拷贝(需要 import copy模块):

                              拷贝,只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已

import copy
list1 = [1,2,3,4,[9,99,999,9999,]]
print(id(list1))
list2 = copy.copy(list1)  # 与直接赋值不同的是浅拷贝会新建内存地址,在更改第一层元素时,浅拷贝的对象不会发生变化。
print(id(list2))
list1.append('aaaaaa')
print(list1,list2)       # append更改 第一层元素 浅拷贝对象不会变化。
print(id(list1),id(list2))
list1[4][2] = 'wwwwww'
print(list1,list2)

              

        3、深拷贝需要 import copy模块):

                      可以理解为完全两个对立的数据,修改时互不影响。

       

import copy
list1 = [1,3,[9,99,000,]]
list2 = list1.deepcopy(list1)
print(list1,list2)  # 互不影响

猜你喜欢

转载自blog.csdn.net/qq_16555103/article/details/83748253