一、可变数据与不可变数据类型的区别:
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) # 互不影响