python 直接赋值、浅拷贝、深拷贝

深浅拷贝

在Python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给领一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用,我们称之为浅拷贝

在Python中,为了使当前进行赋值操作时,两个变量互不影响,可以使用copy模块中的deepcopy方法,称之为深拷贝。

直接赋值、浅拷贝和深拷贝三者的区别

        直接赋值:其实就是对象的引用(别名)。

        浅拷贝(copy.cppy()):拷贝父对象,不会拷贝对象内部的子对象。

        深拷贝(copy.deepcopy()):copy模块的deepcopy方法,完全拷贝父对象及其子对象。

在Python中,对象赋值实际上是对像的引用。当创建一个对象,然后把它赋给另一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用。

具体案例分析:

1、直接赋值:

"""
    直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变
"""
alist = [1, 2, 3, ["a", "b"]]
b = alist
print(f"直接赋值后列表b:{b}")

alist.append(5)
b.append(6)
print(f"修改之后列表a:{alist}")
print(f"修改之后列表a:{b}")

执行结果

       直接赋值后列表b:[1, 2, 3, ['a', 'b']]
       修改之后列表a:[1, 2, 3, ['a', 'b'], 5, 6]
       修改之后列表a:[1, 2, 3, ['a', 'b'], 5, 6]

赋值:传递对象的引用而已,原始列表改变,被赋值的也会做相同的改变。

2.浅拷贝

   

import copy

"""
    没有拷贝子对象,所以原始数据改变,子对象会随着发生变化。
"""
alist = [1, 2, 3, ["a", "b"]]
c = copy.copy(alist)
print(f"原始列表:{alist}")
print(f"浅拷贝后列表b:{c}")

alist.append(5)
alist[3].append("ccc")
print(f"修改之后列表a:{alist}")
print(f"修改之后列表a:{c}")

执行结果:

        原始列表:[1, 2, 3, ['a', 'b']]
        浅拷贝后列表b:[1, 2, 3, ['a', 'b']]
        修改之后列表a:[1, 2, 3, ['a', 'b', 'ccc'], 5]
        修改之后列表a:[1, 2, 3, ['a', 'b', 'ccc']]

浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象,即拷贝列表里面的一级元素的内存地址

3、深拷贝

import copy

"""
    包含对象里面的对象的拷贝,
    所以原始对象的改变不会造成深拷贝里任何子元素的变化
"""
alist = [1, 2, 3, ["a", "b"]]
d = copy.deepcopy(alist)
print(f"原始列表:{alist}")
print(f"浅拷贝后列表b:{d}")

alist.append(5)
alist[3].append("ccc")
print(f"修改之后列表a:{alist}")
print(f"修改之后列表a:{d}")

执行结果:

        原始列表:[1, 2, 3, ['a', 'b']]
        浅拷贝后列表b:[1, 2, 3, ['a', 'b']]
        修改之后列表a:[1, 2, 3, ['a', 'b', 'ccc'], 5]
        修改之后列表a:[1, 2, 3, ['a', 'b']]

深拷贝:copy模块的deepcopy方法,完全拷贝了父对象及其子对象。

不可变类型

        不管深拷贝还是浅拷贝都是指向同样的对象。

                字符串、数值、元组均为不可变类型。

可变类型:

        浅拷贝就是一级元素的拷贝,深拷贝会完全拷贝父对象及其子对象。

                列表、字典、set为可变类型。

变量有时比较复杂,存在组合现象,比如字典中包含列表,列表中包含字典,但赋值是,总是属于某个类型。如果实在不清楚状况,可以试验一下,用id()函数,如果是引用,两个变量指向的地址是相同的。

id()函数:返回对象的唯一标识,可以类比成该对象在内存中的地址。

猜你喜欢

转载自blog.csdn.net/qq_41292236/article/details/103423430