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 ...
随机推荐
- 18 12 18 给服务器添加logging 日志功能
Python中有个logging模块可以完成相关信息的记录,在debug时用它往往事半功倍 1. 日志级别 日志一共分成5个等级,从低到高分别是: DEBUG INFO WARNING ERROR C ...
- vue的选项卡功能
选项卡:点击不同的按钮会显示不同的内容 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习:prototype(原型对象)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 实现3d效果
transform-origin: center left 60px;可以实现3d转换
- 数据处理pandas
1.缺失值时间戳不为NaN,为NaT, 同样判断都为isna()或notna()方法2.删值\去重 df.dropna() df.drop_duplicates() 3.上下值插值 df.fillna ...
- AttributeError: module 'selenium.webdriver.common.service' has no attribute 'Service'
今天爬虫时需要使用到selenium, 使用pip install selenium进行安装. 可是一开始写程序就遇到了AttributeError: module 'selenium.webdriv ...
- LIINQ TO JS
记录一下,方便自己查找... 自己在开发前端时,对于处理JSON,觉得真是枯燥.处理数据,基本都要循环. 所以我想着前端也能跟后端一样,有Linq来处理我的JSON对象就好了.上网一搜,找到了JSLI ...
- TF分布式问题
碰到一个没解决的问题. 用tensorflow 分布式异步更新模式训练模型, 模型中带正则项, 每个batch的损失函数为 \[\lambda \|W\|_1 + \frac 1 {N_j} \sum ...
- Ubuntu 安装软件时显示:无法获得锁 /var/lib/dpkg/lock -open(资源暂时不可用)
出错状况:在用 sudo apt-get install 安装软件时,结果终端提示: 无法获得锁 /var/lib/dpkg/lock -open(资源暂时不可用) 无法锁定管理目录(var/lib/ ...
- PAT Advanced 1081 Rational Sum (20) [数学问题-分数的四则运算]
题目 Given N rational numbers in the form "numerator/denominator", you are supposed to calcu ...