一、数字、字符串不论是浅拷贝、深拷贝都是指向一个地址。

a = 1
b = "abc"
print (id(a))
print (id(b))
a1 = a
b1 = b
print (id(a1),id(b1))
a2 = copy.copy(a)
b2 = copy.copy(b)
print (id(a2),id(b2))
a3 = copy.deepcopy(a)
b3 = copy.deepcopy(b)
print (id(a3),id(b3))

二、列表、元组、字典的浅拷贝、深拷贝指向的地址是变化的。

1.元组中包含列表、字典

#定义个函数:打印元组中所有数据的地址
def print_tuple(tuple):
tup = tuple
print tup,id(tup)
for k, v in enumerate(tup, 1):
print v, id(v)
if type(v) == list:
key = v
for k, v in enumerate(key, 1):
print v, id(v)
elif type(v) == dict:
key = v
for item in key:
print item, id(item)
print key[item], id(key[item])
tup = (1,2,['a','b'],{"k1":11})
print "1、元组中包含字典、列表"
print_tuple(tup) #tup1 = tup
#print "======赋值后======"
#print_tuple(tup1) tup2 = copy.copy(tup)
print "======浅拷贝后======"
print_tuple(tup2) tup3 = copy.deepcopy(tup)
print "======深拷贝后======"
print_tuple(tup3)

赋值、浅拷贝后,元组和元组中所有元组地址,都指向的是一个地址;

深拷贝后,元组、元组中列表、字典的地址都是新创建的,其他的元素地址与原来一致;

2.字典中包含列表、元组

#定义个函数:打印字典中所有数据的地址
def print_dic(dict):
dic = dict
print dic,id(dic)
for item in dic:
print item, id(item)
print dic[item], id(dic[item])
if type(dic[item]) == list:
li = dic[item]
for k, v in enumerate(li, 1):
print v, id(v)
elif type(dic[item]) == tuple:
tup = dic[item]
for k, v in enumerate(tup, 1):
print v, id(v) dic = {"a":11,"c":12,"d":('x',100,'z'),"":["b",13]}
print "2、字典包含列表、元组"
print_dic(dic)
#dic1 = dic
#print "======赋值后======"
#print_dic(dic1) dic2 = copy.deepcopy(dic)
print "======深拷贝后======"
print_dic(dic2) #dic3 = copy.copy(dic)
#print "======浅拷贝后======"
#print_dic(dic3)

赋值指向的是一个地址;

浅拷贝后,字典的地址是新创建的,里面元素(包括列表、元组)的地址与原来一致;

深拷贝后,字典的地址、字典中列表的地址是新创建的,元组的地址还是原来的,里面的元素地址与原来一致;

3.列表中包含字典、元组

#定义个函数:打印列表中所有数据的地址
def print_out(list):
li = list
print li,id(li)
for item in li:
print item, id(item) # print li[i],id(li[i])
if type(item) == dict:
dic = item
# for k,v in enumerate(dic,1):
# print k,id(k)
# print v,id(v)
for item in dic:
print item, id(item)
print dic[item], id(dic[item])
elif type(item) == tuple:
tup = item
for k, v in enumerate(tup, 1):
print v, id(v) li = ['',('x','y'),{"k1":0,"k2":10}]
print_out(li)
#li1 = li
#print "======赋值后======"
# print_out(li1)
#li2 = copy.copy(li)
#print "======浅拷贝后======"
#print_out(li2)
li3 = copy.deepcopy(li)
print "======深拷贝后======"
print_out(li3)

赋值指向的是一个地址;

浅拷贝后,列表的地址是新创建的,里面元素(包括字典、元组)的地址与原来一致;

深拷贝后,列表的地址、列表中字典的地址是新创建的,元组的地址还是原来的,其他的元素地址与原来一致;

总结:

1.元组本身在深浅拷贝中,地址会变;但作为列表或者字典的元素时,在深拷贝列表或字典时,地址是不变的。

2.列表、字典本身在浅拷贝中地址会变;作为元素时,在深拷贝中地址才会变;

Python练习四-浅拷贝&深拷贝的更多相关文章

  1. python开发_copy(浅拷贝|深拷贝)_博主推荐

    在python中,有着深拷贝和浅拷贝,即copy模块 下面我们就来聊一下: 运行效果: ================================================== 代码部分: ...

  2. Python中的浅拷贝 深拷贝

    浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种: 1. copy 从下面的例子可以看出对象c从a拷贝,当对象a增加一个列表元素之后,c对象没有改变, 而当对象a中的子列表改变时,对象c的子列 ...

  3. PythonStudy1——Python 值拷贝 浅拷贝 深拷贝

    拷贝:对值进行复制的过程 # 值拷贝:应用场景最多  ls = [1, 'abc', [10]] ls1 = ls # ls1直接将ls中存放的地址拿过来  # ls内部的值发生任何变化,ls1都会随 ...

  4. python中赋值-浅拷贝-深拷贝之间的关系

    赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...

  5. JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

    一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...

  6. Python__学习路上的坑之--引用,浅拷贝,深拷贝

    copy : 相当于只是拷贝表面一层,如果里面还有深层次的引用,那么也是直接拷贝引用的地址,而且如果拷贝对象是不可变类型比如元组,那么也是直接拷贝引用. deepcopy: 无论是拷贝可变类型还是不可 ...

  7. C#四种深拷贝方法

    //四种深拷贝方法 public static T DeepCopyByReflect<T>(T obj) { //如果是字符串或值类型则直接返回 if (obj is string || ...

  8. 简学Python第四章__装饰器、迭代器、列表生成式

    Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群  群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...

  9. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

随机推荐

  1. 51nod 1421:最大MOD值

    1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...

  2. 题目(或游戏)流程控制器上传到GitHub

    题目控制系统 1 支持 题目按相同的个数分组 2 支持 pause resume 3 支持 每题限定时间 4 支持 支持对计时器进行回调 5 支持 在全流程开始,全流程结束,每组开始,每组结束,每题开 ...

  3. CDH6.2安装配置第二篇:CDH安装的前期配置

    本篇介绍cdh安装之前需要的一些必要配置,当然这些配置也可以用shell脚本来配置.在安装之前请先配置好yum源,在文中用的统一都是阿里源.在安装的时候,要确保主机的内存是4G以上,要不然会无限重启c ...

  4. [转]Log4j使用总结

    Log4j使用总结   一.介绍 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器. ...

  5. 查看docker的挂载目录

    docker inspect container_name | grep Mounts -A 20docker inspect container_id | grep Mounts -A 20

  6. 无车承运前世今生,5G货运管家期待您的加入

    历时三年的无车承运人试点工作结束,从2020年1月1日起,将执行新的暂行<办法>,在这样一个承前启后的阶段,无车承运人的命运如何?网络货运经营者又是何物? 在新赛道下,将迎来什么样的机遇和 ...

  7. C语言-数组的深入学习

    深入学习一下数组1.从内存角度来讲:数组变量就是一次分配多个变量,而且这些变量的地址是连续的,也就是存放这些变量的存储单元是依次相连接的.而且这多个变量必须单独访问,不可以一起访问的.因为他们的地址彼 ...

  8. 题解【[FJOI2018]所罗门王的宝藏】

    本题解同步于luogu emmm切了近年省选题来写题解啦qwq 该题较其他省选题较水吧(否则我再怎么做的出来 思路是图论做法,做法上楼上大佬已经讲的很清楚了,我来谈谈代码实现上的一些细节 \[\tex ...

  9. docker安装fastdfs与java客户端测试

    一.docker 安装FastDFS 1.拉取镜像 docker pull morunchang/fastdfs 2.创建并启动tracker容器 docker run -d --name=track ...

  10. 扫描转换算法——DDA、中点画线画圆、椭圆

    我的理解:在光栅图形学中,由于每一个点的表示都只能是整数值,所以光栅图形学实际只是对对实际图形的近似表示. 数值微分法(DDA):以下PPT截图来自北京化工大学李辉老师 代码实现: import ma ...