B10_Python的直接赋值和浅拷贝以及深拷贝详解

Python中直接赋值,浅拷贝,深拷贝详解

1. Python中的变量存储方式和分类

  1. Python中一切都是对象,python的变量就是一个对象的别名,它通过指针联系到对象实际的存储的地方
  2. Python中对象可以分为可变对象和不可变对象,不可变对象主要有数值,字符串,元组,不可变集合
  3. 对于不可变对象,这个变量指向的内存空间不可被改变,所以当给这变量赋值的时候,会重新开辟一块内存空间,变量再指向这个新的内存空间
  4. 对于可变对象,这个变量的值改变的时候,实际上就是所指的内存空间保存的值发生了变化,没有开辟新的内存空间,也没有发生复制行为,就是原地改变了内存空间中的值

2. 变量的赋值语句

让我们看看赋值语句 a = "Fioman",python解释器都做了什么工作


上面是变量的第一次赋值,又叫初始化,如果是不可变对象的重新赋值,则会重新开辟一段内存空间,改变它的绑定关系.比如 a = "Hammer"

如果是可变的对象,变量的赋值语句有所不同

例如 val = [1,2,3,4]

  • 结论

    1. 当普通的不可变类型(数值,字符串,元组)在初始化和赋值的时候都会重新开辟一段新的内存来保存新的值
    2. 当复杂的数据结构在赋值的时候,如果只是修改其中的元素,不会更改这个变量本身的内存地址,只是更改了复杂数据结构元素的地址.

3. 浅拷贝

  • 浅拷贝原理

    1. 浅拷贝只是拷贝了原来的对象的第一层的引用,浅拷贝变量本身的地址是一个新的
    2. 浅拷贝的内容不是新的,也就是说浅拷贝的新对象的内容和旧对象是同一个
    3. 浅拷贝只是改变了最外层变量的地址,但是这个变量里面的元素指向的是同一块内存
    4. 浅拷贝的对象和旧对象是两个独立的对象,它们的子对象还是指向了同一个对象

  • 浅拷贝常见的方式

    1. 切片赋值 val = lst[:]
    2. 各种工厂函数 set(),dict(),list(),tuple(),以及它们的copy()函数
    3. copy模块的copy()方法

4. 深拷贝

  • 深拷贝原理

    1. 深拷贝和浅拷贝一样,都会创建一个新的容器对象
    2. 和浅拷贝不同的是,深拷贝的子对象也会重新创建一个新的对象
    3. 深拷贝的对象和旧拷贝的对象,是相互独立的,双方互不影响
    4. 深拷贝的对象和旧对象会共享不可变的子对象,但是因为不可变,所以不影响它们之间的独立性

  • 深拷贝的方式

    copy.deepcopy ndarray.copy()

おすすめ

転載: blog.csdn.net/Fioman_GYM/article/details/120614672