python之深浅copy

三.深浅copy
调用方法:
import copy #浅拷贝
copy.copy()
深拷贝
copy.deepcopy() #赋值
1. 对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
举例:
import copy
#字符串,数字
a1 = ‘adddddd‘
a2 = ‘12322‘
a2 = a1
print(id(a1))
print(id(a2))
a3 = copy.deepcopy(a1)
print(id(a1))
print(id(a3))
输出结果:
41923448
41923448
41923448
41923448
2.赋值,只是创建一个变量,该变量指向原来内存地址,对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同
2.1. 对于浅拷贝

import copy
list_a = [1,2,3,"hello",["python","C++"]]
list_b = list_a
list_b = copy.copy(list_a)
list_c = copy.deepcopy(list_a)
list_b.append([4,5])
print(list_a)
print(list_b)
list_a[4].append("C")
print(list_a)
print(list_b)
print(list_c)

输出结果:

C:\Python34\python.exe E:/Python/S12/day1/test1.py
[1, 2, 3, ‘hello‘, [‘python‘, ‘C++‘]]
[1, 2, 3, ‘hello‘, [‘python‘, ‘C++‘], [4, 5]]
[1, 2, 3, ‘hello‘, [‘python‘, ‘C++‘, ‘C‘]]
[1, 2, 3, ‘hello‘, [‘python‘, ‘C++‘, ‘C‘], [4, 5]]
[1, 2, 3, ‘hello‘, [‘python‘, ‘C++‘]]

list_a和list_b是不同的对象,修改list_b理论上不会影响list_a。比如list_b.append([4,5])。
但是要注意,浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在list_a中有一个嵌套的list,如果我们修改了它,查看list_b,将发现list_b也发生了变化。这是因为,你修改了嵌套的list。修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地址并为发生变化,指向的都是同一个位置。

非常重要的结论:修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地址并未发生变化,指向的都是同一个位置。

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因而,它的时间和空间开销要高。 同样对list_a,若使用list_b = copy.deepcopy(list_a),再修改list_b将不会影响到list_a了。即使嵌套的列表具有更深的层次,也不会产生任何影响,因为深拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何关联。
例子:
dic = {
"cpu":[80,],
"men":[80,],
"disk":[80,],
}
print(‘brefore‘,dic)
new_dic = copy.copy(dic)
new_dic[‘cpu‘][0] = 50
print(dic)
print(new_dic)

new_dic = copy.deepcopy(dic)
new_dic[‘cpu‘][0] = 30
print(‘2‘,dic)
print(‘2‘,new_dic)

输出结果:
C:\Python34\python.exe E:/Python/S12/day3/s2.py
brefore {‘cpu‘: [80], ‘men‘: [80], ‘disk‘: [80]}
{‘cpu‘: [50], ‘men‘: [80], ‘disk‘: [80]}
{‘cpu‘: [50], ‘men‘: [80], ‘disk‘: [80]}
2 {‘cpu‘: [50], ‘men‘: [80], ‘disk‘: [80]}
2 {‘cpu‘: [30], ‘men‘: [80], ‘disk‘: [80]}

时间: 2024-10-05 05:31:31

python之深浅copy的相关文章

【python】-- 深浅copy、集合

深浅copy 1.数字.字符串的copy: 赋值(=).浅拷贝(copy)和深拷贝(deepcopy)其实都一样,因为它们永远指向同一个内存地址: >>> import copy >>> n1 = 123 >>> print(id(n1)) #打印n1的内存地址 502665488 ##赋值## >>> n2 = n1 >>> print(id(n2)) 502665488 ##浅拷贝## >>>

Python 集合 深浅copy

一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系测试,测试两组数据之前的交集.差集.并集等关系. 1,集合的创建. set1 = set({1,2,'barry'}) set2 = {1,2,'barry'} print(set1,set2) # {1, 2, 'barry'} {1, 2, 'barry'} 2,集合的增. set1 =

python的深浅copy

#!/usr/bin/env python #-*- coding:utf-8 -*- a='abc' b=a a='def' print(b) #这里打印的是abc #1.执行a = 'abc',解释器创建了字符串'abc'和变量a,并把a指向'ABC' #2.执行b=a,解释器创建了变量b,并把变量b指向了变量a所指向的abc #3.执行a = 'def',解释器创建了字符串'def',并把a的指向改为'def',但b并没有更改: #所以最后打印的是abc name={ "z":{

python集合深浅copy

01昨天内容回顾 代码块:由一个文件,一个函数,一个模块,一个类,交互模式下每一行都是一个代码块 Is == id:id()是查询内存地址,==比较两边的值,is是比较两边的内存地址. 小数据池: 在内存中创建一个池,提前存放了-5~256的整数,一定规则的字符串,后续程序中,如果设置的变量指向的是小数据内容,那就不会再内存中重新创建. 1.节省内存 2.提高性能和效率. 小数据池和代码块的关系. 同一个代码块:python在执行时,遇到了初始化对象,他会将这个变量和数值放在一个字典中,再次遇到

python 列表深浅copy 及相关操作

1.浅COPY,如果源变化,p1[1][1].p2[1][1].person[1][1]会一起变化 import copyperson = ['name',['saving',100]]'''p1 = copy.copy(person)p2 = person[:]p3 = list(person)'''p1 = person[:]p2 = person[:]print(p1)print(p2) p1[0] = 'alex'p2[0] = 'fengjie'print(p1)print(p2) p

python之深浅copy与id

我们都知道 所谓变量就是就是在空间中开辟一块内存空间.来存放东西的 学过c语言的都知道而数组也是有内存地址的 我们如何来查看内存地址呢?id()这函数就来了 x = 5 print(id(x)) 如此一来我们就可以查看x的内存地址了他的内存地址是 1940307088 首先我们来看一个现象 我们把数组赋值给一个变量a 然后在把a赋值给b 在来改变a的值 看看b 是否会发生变化呢? a = [1,2,3] b = a a[0] = 11 print(b) 得出的结果是 [11, 2, 3] 很显然

python深浅copy探究

引入 在python程序中,如果我们操作一个变量的值去做运算,而又想在下次调用时,仍使用原来的变量的值去做运算,那么我们我们就需要将这个变量去做备份,这就是本文所要探究的问题. 开始 变量-对象-引用: python中全部皆对象,Python中变量是指对象(甚至连type其本身都是对象,type对象)的引用,Python是动态类型,程序运行时候,会根据对象的类型来确认变量到底是什么类型. 我们有时候会见到这样一种情况: a = 1 b = a 这样做不就是把数据copy了一份吗,错,这样做只是在

python之旅 1-29 补充内容,深浅copy

#  l1 = [111,222,333,444,555] 将索引为奇数位的元素删除. # l1 = [111,222,333,444,555] # del l1[1::2] # print(l1) 通过删除列表中的元素 # for i in range(len(l1)-1,0,-1): # if i%2==0: # del l1[i-1] # print(l1) 通过循环列表,用range指代索引位置 for i in l1: if l1.index(i)%2==0: l2.append(i)

python之集合、深浅copy、文件操作、函数初识

本节内容:集合.深浅copy.文件操作.函数初识 1.小知识点补充 2.编码二 3.集合 4.深浅copy 5.文件操作 6.函数的初识 1.小知识点补充                                                                                           1.1 小数据池====str.int 小数据池存在的意义就是节省内存 节省内存,位多个变量开辟一个共享空间(str和int) int:-5--256 int===