Python对象赋值、浅拷贝、深拷贝



Python中,基本数据类型,理解为常见数据类型:布尔型、整型、浮点型、字符串、列表、元组、字典、集合,随语言不同而不同,但是根据在内存中存储方式的不同,区分开原子类型和容器类型。

对象赋值

对象的赋值都是进行(对象引用传递)/(内存地址传递)/(内存引用),所以当一个对象改变,另一个同步改变。

结合代码思考
···
will = ["Will", 28, ["Python", "C#", "JavaScript"]] # 元素的数据类型有原子类型和容器类型
wilber = will
print id(will) # will的id
print will
print [id(ele) for ele in will] # will中每个元素的id
print id(wilber) # wilber的id == will的id
print wilber

will[0] = "Wilber" # 改动will中的元素0
will[2].append("CSS") # 改动will中的元素2
print id(will) # will的id没变
print will
print [id(ele) for ele in will]
print id(wilber) # wilber
print wilber
print [id(ele) for ele in wilber]
···

浅拷贝

浅拷贝对象是容器类型,原子类型只有对象赋值。浅拷贝会新起一个对象,将原容器包含的内存地址引用过去。当原容器包含的元素有可变的(即容器对象),容器元素的改变也会引起新拷贝对象内元素的改变。

结合代码思考

import copy

will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.copy(will)

print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]

will[0] = "Wilber"
will[2].append("CSS")
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]

深拷贝

深拷贝对象也是容器类型,原子类型只有对象赋值。深拷贝和浅拷贝一样,也会根据原对象深拷贝新起一个对象,但是会将元素里面的容器类型的新拷贝一份(默认深入新拷贝层数好像是1),因此原对象的容器元素改变了,新对象的容器元素不会改变。

结合代码思考

import copy

will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.deepcopy(will)

print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]

will[0] = "Wilber"
will[2].append("CSS")
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]

总结

数据结构+算法,需要反复学习+理解+记忆。



https://www.cnblogs.com/wilber2013/p/4645353.html#_nav_1

原文地址:https://www.cnblogs.com/bqwzx/p/10983952.html

时间: 2024-11-08 06:10:32

Python对象赋值、浅拷贝、深拷贝的相关文章

总结:Python的赋值、深拷贝、浅拷贝有什么区别

自我总结: 1)赋值:对象赋值实际上是对象的引用. 在Python中,变量就是地址的一种表示形式,并不开辟开辟存储空间. 2)浅拷贝:只拷贝了顶层(第一层),没有拷贝子对象.所以子对象的原始数据改变,子对象会改变. 3)深拷贝:区别于浅拷贝只拷贝顶层引用,深拷贝会逐层进行拷贝,直到拷贝的所有引用都是不可变引用为止. 为什么Python默认的拷贝方式是浅拷贝? 时间角度:浅拷贝花费时间更少: 空间角度:浅拷贝花费内存更少: 效率角度:浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高. 1.pytho

python的赋值,深拷贝和浅拷贝的区别

原文地址https://www.cnblogs.com/xueli/p/4952063.html 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,["a","b"]] (1)直接赋值,默认传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变 >>> b=alist>>> pri

Python的赋值、深拷贝、浅拷贝

a=b a和b两个对象地址相同 a和b两个对象的子对象地址相同 a=copy.copy(b) a和b两个对象地址不同 a和b两个对象的子对象地址相同 a=copy.deepcopy(b) a和b两个对象地址不同 a和b两个对象的子对象地址不同 可以通过id(a) 来判断a地址,通过[id(x) for x in a]来判断a的子对象地址. 会发现: a=b创建的对象,a和b以及a的子对象和b的子对象都是一样的,a或b的更改会彼此影响.两者的引用地址的一样的. a=copy.copy(b),a只是

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)) 二.列表.元组.字典的浅拷

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

拷贝:对值进行复制的过程 # 值拷贝:应用场景最多  ls = [1, 'abc', [10]] ls1 = ls # ls1直接将ls中存放的地址拿过来  # ls内部的值发生任何变化,ls1都会随之变化 ls2 = ls.copy() # 新开辟列表空间,但列表中的地址都是直接从ls列表中拿来  # ls内部的可变类型值发生改变,ls2会随之变化 ls3 = deepcopy(ls) # 新开辟列表空间,ls列表中的不可变类型的地址直接拿过来,但是可变类型的地址一定重新开辟空间  # ls内

Python对象拷贝——深拷贝与浅拷贝

对象赋值 浅拷贝 深拷贝 1. 对象赋值 对象的赋值实际上是对对象的引用.也就是说当把一个对象赋值给另一个对象时,只是拷贝了引用.如: >>> t1 = tuple('furzoom') >>> t2 = t1 >>> id(t1),id(t2) (139792198303936, 139792198303936) 上面t1和t2代表的是同一个对象. 2. 浅拷贝 除了上面将一个对象直接赋值给另一个对象外,还有两种常用的方法对对象进行拷贝:使用切片操作

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

一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实例化的的时候就不用对每个实例定义该属性方法,所有的实例均具有该方的引用见最后的输出. function Myclass(){ this.x=" x in Myclass"; this.get=function(){}//每次实例化对象,每个对象的该方法都是独立的,是不相同的 } Mycla

(一)Python入门-6面向对象编程:11对象的浅拷贝和深拷贝

对象的浅拷贝和深拷贝: 变量的赋值操作 只是形成两个变量,实际还是指向同一个对象. 浅拷贝 Python拷贝一般都是浅拷贝.拷贝时,对象包含的子对象内容不拷贝.因此,源对象 和拷贝对象会引用同一个子对象. 深拷贝 使用copy模块的 deepcopy 函数,递归拷贝对象中包含的子对象.源对象和拷贝对象 所有的子对象也不同. [操作] #测试对象的引用赋值,浅拷贝,深拷贝 import copy class MobilePhone: def __init__(self,cpu,screen): s

Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解

Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解 概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新列表l1 = [1, 2, 3, 4, 5]# 对l2赋值l2 = l1print(l1)l2[0] = 100print(l1) 示例结果: [1, 2, 3, 4, 5][100, 2, 3, 4, 5] 可以看到,更改赋