python 可变对象 不可变对象 简单变量 复杂变量的可变 不可变 浅拷贝 深拷贝 copy deepcopy

以下结论 都经过代码验证  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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值