python初学一(深浅copy)

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

                 https://blog.youkuaiyun.com/qq_16555103/article/details/83928948  -------- 可变与不可变数据类型

                 https://blog.youkuaiyun.com/qq_16555103/article/details/83685961  ---------- 深浅拷贝的图解

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

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

a = 1
b = 1                 ------------- 相当于 b = a  这是一个引用
print(id(a),id(b))    ------------- 查看原地址   1512792224 1512792224
===================================================================================                 
a = 2 
print(id(a),a)          ------------- 地址发生改变;结果: 1512792256 2
print(b)                ------------- b不会改变(因为a是不可变类型,a重新指定了新的值);结果:2

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

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

1、修改可变元素 内存地址不变:
list1 = [1,2,4]
print(id(list1)) ------------   1512792224
list1[1] = 'a'        
print(id(list1)) ------------   1512792224  
==================================================================================
2、可变元素的引用的特性:
list1 = [1,2,3,4]
list2 = list1        --------- 引用,共用一块空间(为了防止可变元素引用关联的特性,需要用深浅拷贝来防止这种特性)             
list1[2] = 9999
print(list1,list2)   --------- [1,2,9999,4] [1,2,9999,4]
==================================================================================
list.append(可变元素) --------- 他添加的 可变元素 就是一种引用

 

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

         1、直接赋值:引用

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

          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)  # 互不影响

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值