在Python中,对变量进行赋值操作,实际是一个浅拷贝动作,将赋值号右边的对象引用赋给了赋值号左边的变量。
s = "abcdefg"
如上面这句代码,实际是先创建一个字符串对象,内容为abcdefg,然后将该对象的引用赋给变量s。同样的,如果将s再赋值给另一个字符串变量s1,同样也是将引用赋给s1,所以对s1的修改,会影响s的内容,因为他们是指向同一样内存地址。
对于简单数据类型,浅拷贝和深拷贝是没有区别的。但是对于复杂的数据类型,如列表,字典,类,或是其它自定义的可嵌套的数据类型,浅拷贝和深拷贝还是有区别的,下面以字典类型为例进行说明。
import copy d1 = {"Name":"Chris", "Account":{"RMB": 1000, "USD": 12345}} d2 = copy.copy(d1) d3 = dict(d1) d4 = d1 print [id(x) for x in d1, d2, d3, d4] d2["Name"] = "Martin" #修改d2中的Name值 d2["Account"]["RMB"] = 2000 #修改d2中的人民币帐户金额 print [x for x in d1, d2, d4] #输出d1, d2, d4内容,d4和d1内容相同,修改d2的人民币帐户金额会影响到d1中的人民币帐户金额 d3["Name"] = "Vivian" #修改d3中的Name值 d3["Account"]["RMB"] = 3000 #修改d3中的人民币帐户金额 print [x for x in d1, d3, d4] #输出d1, d3, d4内容,d4和d1内容相同,修改d3的人民币帐户金额会影响到d1中的人民币帐户金额 d3 = copy.deepcopy(d1) d3["Name"] = "Vivian" #修改d3中的Name值 d3["Account"]["RMB"] = 6000 #修改d3中的人民币帐户金额 print [x for x in d1, d3, d4] #输出d1, d3, d4内容,d4和d1内容相同,修改d3的人民币帐户金额不会影响到d1中的人民币帐户金额
输出的结果为
[13744000, 13745872, 13746016, 13744000] [{'Account': {'RMB': 2000, 'USD': 12345}, 'Name': 'Chris'}, {'Account': {'RMB': 2000, 'USD': 12345}, 'Name': 'Martin'}, {'Account': {'RMB': 2000, 'USD': 12345}, 'Name': 'Chris'}] [{'Account': {'RMB': 3000, 'USD': 12345}, 'Name': 'Chris'}, {'Account': {'RMB': 3000, 'USD': 12345}, 'Name': 'Vivian'}, {'Account': {'RMB': 3000, 'USD': 12345}, 'Name': 'Chris'}] [{'Account': {'RMB': 3000, 'USD': 12345}, 'Name': 'Chris'}, {'Account': {'RMB': 6000, 'USD': 12345}, 'Name': 'Vivian'}, {'Account': {'RMB': 3000, 'USD': 12345}, 'Name': 'Chris'}]
首先,我们在第3行定义了一个字典变量d1,第4到6行分别用COPY模块中的COPY方法(浅拷贝),工厂方法(dict)和赋值号将赋值给d2,d3和d4。
第8行语句输出这四个变量的内存地址,可以发现,d1和d4指向同一个地址,这证实了我们前面说的,赋值号是对引用进行赋值。
d2和d3有着自己的内存地址且与d1不同,这说明COPY函数和工厂方法(dict)会新开辟内存空间,并将赋值号右边的内容复制到新的内存地址。
第10到15行代码修改变量d2和d3的内容及其子对象(Account是他们的子对象)中的内容,可以发现d2和d3中的Key为Name的值发生了变化,没有影响d1中的值;可是我们修改d2和d3中Key为Account中的RMB的值时,变量d1的RMB值也跟着发生了变化,这说明了执行浅拷贝操作,只是会复制父对象内容,其子对象仍然是引用,也就是说d1,d2和d3中的Account对象是同指向同一个内存地址,所以无论我们是对d2还是d3中的Account进行修改时都会影响到d1中的Account值。如果想让这三个变量中是子对象互不影响,我们就需要用到COPY模块中的deepcopy方法。
第17到20行代码就是使用了deepcopy方法,对d3的子对象修改不会影响到d1的子对象。
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
番茄的随笔之FIR与IIR滤波
随着中国股市近来的新情况、新形势和新问题的出现,证券分析师燕翔在国信证券的市场思考随笔中提出了投资理念的转变,并对其进行了深入分析。这四个转变方向分别是:价值投资不等于低估值投资、传统经济周期框架分析...
教师随笔-初中道德与法治教师随笔5篇.docx
最新小学二年级道德与法治教学随笔.pdf
小学二年级道德与法治教学随笔.docx
1. **散文与随笔的区别**:散文通常指的是结构自由、形式灵活、语言优美、情感丰富的文学体裁,它强调的是意境和情感的表达;而随笔则更为随意,通常是作者对某一主题的即时感悟,篇幅短小,但富有哲理。 2. **黄牛...
很抱歉,但根据您给出的信息,标题和描述中提到的是"网恋随笔散文随笔散文.rar",这明显与IT行业知识不相符,而更倾向于文学或个人创作。标签虽为"教育",但没有具体的IT教育相关知识点。压缩包子文件的文件名称列表...
随笔之十二-高压直流输电系统.doc
本项目是一款基于Java和跨平台技术的crostitch涂鸦随笔设计与实现源码,包含65个文件,其中包括30个Java源文件、16个PNG图片文件、7个JavaScript文件、2个XML文件、1个Git忽略文件、1个Markdown文件、1个Maven项目...
【标题解析】 "散文随笔【人间五月散文随笔】.rar" 这个标题表明这是一...综上所述,这个压缩包提供了一本以"人间五月"为主题的散文随笔集,不仅供读者欣赏文学之美,还具有教育价值,可作为教育资源应用于教学活动中。
工程数学软件实用入门资料,可视很好,不需要专门的语言。
【小忆故乡随笔】是一本充满情感温度与文化深度的随笔集,它不仅仅是作者对故乡记忆的一次深情回顾,更是一次对乡土文化的深刻反思和记录。在这个快节奏的社会里,故乡的印象往往变得模糊,而这本书就像一座桥梁,...
- **保育与教育并重**:幼儿园的工作不仅要关注儿童的保育需求,如饮食、卫生等,还要注重教育质量,通过多样化的活动促进儿童各方面能力的发展。 ### 4. 关注个别差异 - **尊重个体差异**:每个孩子都是独一无二...
关于描写夏天的散文随笔.doc
在一年级的道德与法治课堂上,教师不仅是知识的传递者,更是学生成长道路上的引导者和塑造者。教育的真谛在于激发学生的内在潜能,培养其道德感和法治观念,这不仅需要教师具备扎实的专业知识,更需要他们具备不断...
【标题】:人生随笔六篇 - 感悟...总结:这六篇随笔深入浅出地阐述了人生的种种感悟,提醒读者关注内心世界,珍视简单的幸福,并以积极的心态面对生活中的挑战。通过比喻和故事,传递了积极向上的人生态度和生活智慧。
然而,随笔所要传达的更深一层含义是,我们应当理解并表达出个人的真实想法和价值观。孔融的礼让行为背后,可能有着多种复杂的考量,但其核心在于个体的真实与真诚。 随笔中也引入了“心灵不会是一块闲置的空地”的...
一年级数学第一学期教学随笔.pdf
关于小学一年级数学下册教学随笔.docx
4. **数组与集合框架**:Java提供了丰富的数组和集合类,如ArrayList、LinkedList、HashSet、HashMap等,以及它们的操作和适用场景。 5. **字符串处理**:String类在Java中是不可变的,笔记可能涵盖了字符串的创建...