Python 赋值、浅拷贝、深拷贝

Python学习笔记1

Posted by xv_rong on March 30, 2021

赋值、浅拷贝、深拷贝

赋值

创建了一个到对象的引用,不开辟新的内存空间。

浅拷贝

  • 浅拷贝不可变对象

    同赋值

  • 浅拷贝可变对象

    将原来的对象空间的内容直接复制一份到新的空间中

tips:

a =  [1, 2, [1, 2]]
b = copy.copy(a)

b 所指的对象空间中会有三个内容:

1, 2 和指向[1, 2]的一个指针。

改变b中的[1, 2]的元素, a中的[1, 2]也会改变,因为a和b的第三个元素,列表指针指向同一片空间。

引起浅拷贝的操作:切片操作,工厂函数,copy.copy()

深拷贝

  • 深拷贝不可变对象

    同赋值

  • 深拷贝可变对象

    生成一个和原对象完全互不影响的对象。

引起深拷贝的操作:copy.deepcopy()

代码实例

#id()函数:获取对象的内存地址
import copy


def main():
    ### 赋值 ###
    a = [0, 0]
    b = a
    b[0] = 1
    print(f'a = {a}')
    print(f'b = {b}')
    print(f'id(a) == id(b) : {id(a) == id(b)}')
    
	""""
    a = [1, 0]
	b = [1, 0]
	id(a) == id(b) : True
    """"
    
    ### 浅拷贝 ###
    # 不可变对象
    a = (1, 2, 3)
    b = copy.copy(a)
    print(f'id(a) == id(b) : {id(a) == id(b)}')
    
    """"
    id(a) == id(b) : True
    """"

    # 可变对象
    a = [1, 2, [1, 2]]
    b = copy.copy(a)
    b[0] = 0
    b[2][0] = 0
    print(f'a = {a}')
    print(f'b = {b}')
    print(f'id(a) == id(b) : {id(a) == id(b)}')
    print(f'id(a[2]) == id(b[2]) : {id(a[2][0]) == id(b[2][0])}')
    
    """"
	a = [1, 2, [0, 2]]
	b = [0, 2, [0, 2]]
	id(a) == id(b) : False
	id(a[2]) == id(b[2]) : True
    """"

    ### 深拷贝 ###
    # 不可变对象
    a = (1, 2, 3)
    b = copy.deepcopy(a)
    print(f'id(a) == id(b) : {id(a) == id(b)}')
    
	""""
    id(a) == id(b) : True
    """"
    
    # 可变对象
    a = [1, 2, [1, 2]]
    b = copy.deepcopy(a)
    b[0] = 0
    b[2][0] = 0
    print(f'a = {a}')
    print(f'b = {b}')
    print(f'id(a) == id(b) : {id(a) == id(b)}')
    print(f'id(a[2]) == id(b[2]) : {id(a[2][0]) == id(b[2][0])}')
     
	"""
	a = [1, 2, [1, 2]]
	b = [0, 2, [0, 2]]
	id(a) == id(b) : False
	id(a[2]) == id(b[2]) : False
	"""

if __name__ == '__main__':
    main()