以下结论 都经过代码验证 python3.8
首先说几个定义
python的
可变对象:列表 list 字典 dict
含义: 声明 或者定义了一个列表或者字典之后 他的值是可以发生改变的 而且改变了之后
变量指向的内存空间地址是不会改变的
不可变对象:字符串 str 布尔类型 bool 整数 int 浮点数 float 数字 (int和float) # 日期 date 元组 tuple
含义:声明 或者定义了一个不可变对象之后路 他的值也是可以发生改变的的 但是改变了之后
变量指向的内存空间地址是发生了改变的
就是说 可变对象值改变了之后 新的变量还是原来的那个变量
不可变对象改变了之后 新的变量就是一个全新变量 开辟新的内存空间地址
简单变量:单独的的由可变对象或者不可变对象构成的变量 不包含嵌套
复杂变量:包含嵌套的变量 列表嵌套列表 可变对象嵌套可变对象
结论如下:
1、简单、复杂不可变对象的 赋值 copy deepcopy 没有区别等同效果 都会生成新的变量
2、简单可变对象的赋值操作之后 新的变量会影响旧的变量
copy deepcopy深拷贝和浅拷贝操作之后 新的变量不会影响旧的变量
3 、复杂的可变对象 有嵌套存在的变量
第一层的嵌套 相当于 简单可变对象 同以上结论
第二层的嵌套 赋值操作和copy浅拷贝操作是一样的 新的变量会影响旧的变量
deepcopy 深拷贝之后 新的变量不会影响旧的变量
通过id(变量) 来查看内存的地址
4、numpy array 每一个行 可以看做一个简单的可变变量 或者 复杂的可变变量来处理 行与行之间
不存在嵌套的关系
import copy
# 不可变对象 字符串 str 布尔类型 bool 整数 int 浮点数 float 数字 (int和float)
# 日期 date 元组 tuple
# 可变对象 列表 list 字典 dict
# 不可变对象构成的变量:简单变量
# a = 10
# a = '111111'
# a = True
# a = 3.3333
# a = (1, 2, 3)
# b = a
# print(id(a))
# print(id(b))
# a = 11
# a = '2222'
# a = False
# a = 4.44444
# a = (1, 2, 3,4)
# print(id(a))
# print(id(b))
# 不可变对象 简单赋值的效果就是 赋值会生成新的变量 相互独立的
# 不可变的变量的 赋值 copy deepcopy都是一样的
# 可变对象就是 简单的赋值引用 会改变原有的
# -----------------------------
# 简单可变变量的copy deepcopy 是一样的
# a = {'a': '1'}
# b = a
# c = copy.copy(a)
# d = copy.deepcopy(a)
# a['a'] = 2
# print(a)
# print(b)
import numpy as np
arr10 = np.array([[7,8,9],[10,11,12]])
import copy
arr11 = copy.copy(arr10)
print(arr10)
print(arr11)
arr10[0,0] = 99
print(arr10)
print(arr11)
# print(c)
# print(d)
# a = [1, 2, 3, 4]
# b = a
# c = copy.copy(a)
# d = copy.deepcopy(a)
# a[0] = 9
# print(a)
# print(b)
# print(c)
# print(d)
# 复杂可变变量的copy 和 deepcopy
#列表和字典
a = [[5, 6, 7, 8], 2, 3, 4,{'a': '1'}]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
# a[0][0] = 1111
# a[1] = 1111
a[4]['a'] = '2222'
print(a)
print(b)
print(c)
print(d)
# a = {'a': {'c': '1'}, 'b':'2'}
# b = a
# c = copy.copy(a)
# d = copy.deepcopy(a)
# a['a']['c'] = '444'
# print(a)
# print(b)
# print(c)
# print(d)