python 赋值、深拷贝和浅拷贝

参考:
(简单版)https://blog.csdn.net/geek_xiong/article/details/82291328
(详细版)https://blog.csdn.net/ZZh1301051836/article/details/79001304
结论:
1、赋值:对象的引用,可变对象完全一样,不可变对象值相同时,指向相同的对象;改变其值会开辟新的区域存储新值。
2、浅拷贝:对深一层的可变对象无能为力(即该可变对象变化引起所有相应改变),只能保证浅层互不影响。
3、深拷贝:完全独立,即使地址相同(不可变对象),也无法影响其独立性。

可变数据类型:列表list和字典dict;
不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。

用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。

# 赋值——对象引用
# 例1:
print('............赋值例1..............')
x = 3.14
y = x
print([id(item) for item in [x,y]])
# 输出x和y的地址,地址相同
print(x, y)
x = 1.15
print([id(item) for item in [x,y]])
# 此时地址发生了变化,不再相同
print(x, y)
# 两值也不再相等(不可变对象)

# 例2
print('...........赋值例2...............')
a = [1,3,4]
a1 = a
a2 = a
a1[0] = 100
a2[1] = -1
print(a1, a2)
# 各自的改变都影响到了对方
print([id(x) for x in a1])
print([id(x) for x in a2])
# 两列表地址均相同,是同一个列表(可变对象)

# 浅拷贝
print('.........浅拷贝.................')
m = [100,-100]
b = [1, 2, 3, m]
# 两种浅拷贝的方式
b1 = list(b)
b2 = b.copy()
print(id(b), id(b1), id(b2))
for x,y,z in zip(b, b1, b2):
    print(id(x), id(y), id(z))
b1[2] = -10000000
# 仅有b1发生了改变
b2[3][0] = 1
m[1] = 111
# 均发生了改变
print(b, b1, b2)
# 其中元素地址相同修改任意元素均引起改变

import copy
print('..........深拷贝(可变对象)................')
# 可变对象
a = [[1,2],[3,4],[5,6]]
b = a.copy()
b1 = copy.copy(a)
# 浅拷贝得到b
c = copy.deepcopy(a)
# 深拷贝得到c
print('地址:','原始:  ', id(a), '浅拷贝:  ', id(b), '浅拷贝1:  ', id(b1),'深拷贝:  ', id(c))
# a和b不同
print('_________________子元素__________________')
for x,y,z,d in zip(a,b,b1,c):
    # a和b的子对象相同
    print('子项:','原始:  ', id(x), '浅拷贝:  ', id(y), '浅拷贝1:  ', id(z), '深拷贝:  ', id(d))
a[0][0] = 100
b[0][1] = 100
b1[1][0] = 100
c[1][1] = 100
print(a,b,b1,c)

# 不可变对象
print('..........深拷贝(不可变对象)................')
a = [1,2,3,4]
b = a.copy()
b1 = copy.copy(a)
# 浅拷贝得到b
c = copy.deepcopy(a)
# 深拷贝得到c
print('地址:','原始:  ', id(a), '浅拷贝:  ', id(b), '浅拷贝1:  ', id(b1),'深拷贝:  ', id(c))
print('_________________子元素__________________')
for x,y,z,d in zip(a,b,b1,c):
    # 均相同
    print('子项:','原始:  ', id(x), '浅拷贝:  ', id(y), '浅拷贝1:  ', id(z), '深拷贝:  ', id(d))
a[0] = 100
b[1] = 100
b1[2] = 100
c[3] = 100
print(a,b,b1,c)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值