Python 深复制、浅复制的问题

目录

1.直接等号赋值

2.copy.copy

3.copy.deepcopy()

4.元组的复制

6.函数调用


1.直接等号赋值

a is b, a[i] is b[i]

a=[1,2,3];
c=a;
c[0]=10;
print(a);
print(c);
==================
[10, 2, 3]
[10, 2, 3]

被赋值对象认为是原对象的引用,两个变量指向同一个对象,其中一个变量发生变化,另一个变量也随之变化。两个变量的id是相同的。

2.copy.copy

a is not b, a[i] is b[i]

浅复制,两个变量共享子对象

浅复制:两个变量的地址即id不同,但两个变量的元素还是共享同一个地址id

这个地方还是没搞明白,为什么id相同,还会a变b不变呢?

import copy

f=['a','b','c',['d','e']];
g=copy.copy(f);

print(g)
print(f)
print(id(g))
print(id(f))
print(id(g[1]))
print(id(f[1]))
print(id(g[3]))
print(id(f[3]))
=============================
['a', 'b', 'c', ['d', 'e']]
['a', 'b', 'c', ['d', 'e']]
2442999778312
2442999776712
#变量id不同
2442851121896
2442851121896
2442999778440
2442999778440
#变量子元素id相同
=============================
g[0]=10;
print(g)
print(f)
=============================
[10, 'b', 'c', ['d', 'e']]
['a', 'b', 'c', ['d', 'e']]
=============================
g[3].append('f')
print(g)
print(f)
=============================
[10, 'b', 'c', ['d', 'e', 'f']]
['a', 'b', 'c', ['d', 'e', 'f']]
==============================
g[3]='f'
print(g)
print(f)
==============================
[10, 'b', 'c', 'f']
['a', 'b', 'c', ['d', 'e', 'f']]

3.copy.deepcopy()

a is not b, a[i] is not b[i]

深复制,此时两个变量为独立的对象,互不影响

f=['a','b','c',['d','e']];

g=copy.deepcopy(f);
g[0]=10;
print(g)
print(f)

g[3].append('f')
print(g)
print(f)
=============================
[10, 'b', 'c', ['d', 'e']]
['a', 'b', 'c', ['d', 'e']]
[10, 'b', 'c', ['d', 'e', 'f']]
['a', 'b', 'c', ['d', 'e']]

4.元组的复制

列表是可修改的,而元组就是不可修改的列表,不能给元组的元素进行赋值。元组id不变。

import copy

a_tuple=(1,2);
b=copy.copy(a_tuple);
c=copy.deepcopy(a_tuple);
print(b==c)
print(id(b)==id(c));

testlist=[3,4];
cc=copy.copy(testlist);
dd=copy.deepcopy(testlist)
print(cc==dd)
print(id(cc)==id(dd))
=================================
True
True
True
False

5.使用切片、for循环遍历赋值方法

浅复制,同copy.copy相同,只对第一层即第一个维度进行深复制

a=['a','b','c',['d','e']];
b=a[:]
print(id(a))
print(id(b))

b[3].append('f')
print(a)
print(b)
=============================
2443000001544
2442999783752
['a', 'b', 'c', ['d', 'e', 'f']]
['a', 'b', 'c', ['d', 'e', 'f']]
a=['a','b','c',['d','e']];
b=[]
for i in a:
    b.append(i)
print(id(a))
print(id(b))

b[3].append('f')
print(a)
print(b)

===============================
2443000004488
2443000003976
['a', 'b', 'c', ['d', 'e', 'f']]
['a', 'b', 'c', ['d', 'e', 'f']]

6.函数调用

def main(a):
    a[2].append('c')
    print(a)
    
if __name__=='__main__':
    b=[1,2,['a','b']]
    main(b)
    print(b)
=================================
[1, 2, ['a', 'b', 'c']]
[1, 2, ['a', 'b', 'c']]

函数体外的参数b也发生了变化,所以需要在函数体内处理多维列表时,最好先对参数进行深复制,再传入函数,以免发生上述情况。

 

 

参考:https://www.cnblogs.com/xueli/p/4952063.html

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检和功能试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值