Python练习四-浅拷贝&深拷贝
一、数字、字符串不论是浅拷贝、深拷贝都是指向一个地址。
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练习四-浅拷贝&深拷贝的更多相关文章
- python开发_copy(浅拷贝|深拷贝)_博主推荐
在python中,有着深拷贝和浅拷贝,即copy模块 下面我们就来聊一下: 运行效果: ================================================== 代码部分: ...
- Python中的浅拷贝 深拷贝
浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种: 1. copy 从下面的例子可以看出对象c从a拷贝,当对象a增加一个列表元素之后,c对象没有改变, 而当对象a中的子列表改变时,对象c的子列 ...
- PythonStudy1——Python 值拷贝 浅拷贝 深拷贝
拷贝:对值进行复制的过程 # 值拷贝:应用场景最多 ls = [1, 'abc', [10]] ls1 = ls # ls1直接将ls中存放的地址拿过来 # ls内部的值发生任何变化,ls1都会随 ...
- python中赋值-浅拷贝-深拷贝之间的关系
赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...
- Python__学习路上的坑之--引用,浅拷贝,深拷贝
copy : 相当于只是拷贝表面一层,如果里面还有深层次的引用,那么也是直接拷贝引用的地址,而且如果拷贝对象是不可变类型比如元组,那么也是直接拷贝引用. deepcopy: 无论是拷贝可变类型还是不可 ...
- C#四种深拷贝方法
//四种深拷贝方法 public static T DeepCopyByReflect<T>(T obj) { //如果是字符串或值类型则直接返回 if (obj is string || ...
- 简学Python第四章__装饰器、迭代器、列表生成式
Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群 群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
随机推荐
- Intellij IDEA破解方法
1.破解(参考网站) http://idea.lanyus.com/ 2. Intellij idea使用教程 https://github.com/tengj/IntelliJ-IDEA-Tutor ...
- 【每日Scrum】第八天冲刺
一.计划会议内容 继续昨天的设计 二.任务看板 任务看板 已完成:登录与个人界面布局实现 进行中:UI设计美化,,地图主界面 待进行:功能整合,连接数据库 三.scrum讨论照片 四.产品的状态 无 ...
- jenkins忘记登录密码解决方法
第一步:修改配置文件 修改jenkins的配置文件,找到如下几行删除(删除前一定要备份) <useSecurity>true</useSecurity> <authori ...
- linux 下实用工具
gpm 让linux 纯字符终端具备窗口模式下的鼠标功能 xterm + tmux 支持横向或者纵向切屏的终端 urxvt-unicode 支持中文的终端
- java链接redis服务器
1.首先你需要下载驱动包jedis.jar确保下载最新驱动包. 2.public class RedisUtil { //服务器IP地址 private static String ADDR = &q ...
- Qt在vs2010下的配置
https://blog.csdn.net/chenbang110/article/details/7607250 首先不要使用中文目录, 1 下载Qt的安装包和VS2010的Qt插件 2. 安装Qt ...
- Dynamics CRM - 在 C# Plugin 里以 System Administrator 权限来更新 Entity
场景说明: 1.在使用 CRM 系统时,经常会有需要在某个 Entity 下对其他 Entity 的 Record 进行更新,或者在 post 中对自身进行更新,这里就需要用到 SDK 上的 upda ...
- shell的一些一句话东西
shell的一些一句话东西 2010-09-10 11:22:58| 分类: linux shell | 标签:shell linux |举报|字号 订阅 time -p [程序] 可 ...
- 3. laravel 5.5 多子域名 + dingo + jwt 简单环境搭建
环境介绍 laravel 5.5.* + php 7.2 + mysql 5.7.27 1. 创建 laravel 项目 (自行 配置一下域名 如果 不会 请参考laravel 的第一篇文章) com ...
- 用eclipse运行算法第四版的BinarySearch
import java.util.Arrays; import edu.princeton.cs.algs4.In; import edu.princeton.cs.algs4.StdIn; impo ...