一、可变数据与不可变数据类型的区别:
1、不可变数据类型(地址改变):
不可变数据类型指的是不可变对象在进行重新赋值的时候,实际上是将原始值丢弃,将变量指向一个新值,即内存地址会发生改变。
a = 1
b = 1
print(id(a),id(b)) # 查看原地址
b = a
print(id(b))
a = 2
print(id(a)) # 地址发生改变
print(id(2))
# 答案:1512792224 1512792224
1512792224
1512792256
1512792256
2、可变数据类型(地址不会变):
可变数据类型实质上是指更改可变对象中的子对象后,该数据类型的内存地址没有发生变化。
# 赋值修改
list1 = [1,2,4]
print(id(list1))
list1[1] = 'a'
print(id(list1)) # id 不变
list1 = [1,2,3,4]
list2 = []
list2.append(list1)
print(list2)
list1.append(55)
print(list2) # 重点理解记忆
答案:
[[1, 2, 3, 4]]
[[1, 2, 3, 4, 55]] # 改变list1,list2会改变,因为列表时可变元素,地址没有变。
二、直接赋值、浅拷贝、深拷贝的区别(只说可变数据类型):
1、直接赋值:
注意其与浅拷贝的区别。append属于操作第一层元素。
list1 = [1,2,3,4]
list2 = list1 # 相当于房间有两个门牌号,房间本身如果变化,另一个门牌号也会变化。(与浅拷贝的区别是 就算改变第一层的元素也会跟随变化)
list1.append('aaaaaa')
print(id(list1),id(list2)) # 1568338730760 1568338730760
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) # 互不影响