Core Python Programming一书中关于深浅拷贝的错误
该书关于深浅拷贝的论述:
6.20. *Copying Python Objects and Shallow and Deep Copies
"when shallow copies are made, the string is explicitly copied and a new (string) object created"
这是错的.当一个容器对象被浅拷贝,字符串也是和列表一样,都只是建立引用.
奇特的是,作者在这句话之前写有自相矛盾的句子:
A shallow copy of an object is defined to be a newly created object of the same
type as the original object whose contents are references to the elements in the
original object.
当然,和错误的东西相矛盾,那么自然是正确的了.
直接上例子:
>>> r=['a',[1]]
>>> s=r[:]
>>> r==s
True
>>> r is s
False
>>> id(r)
35316200
>>> id(s)
35311128 >>> id(r[0]),id(s[0]),
(19811840, 19811840) #id相同,说明r[0]虽然是字符串对象,但是在浅拷贝过程中仍然是增加引用,并非在s[0]位置上建立了一个新的字符串对象
>>> id(r[1]),id(s[1]),
(35316120, 35316120) >>> r[0]='cg'
>>> r,s
(['cg', [1]], ['a', [1]]) >>> r[1].append(2)
>>> r,s
(['cg', [1, 2]], ['a', [1, 2]]) >>> r[1]=[]
>>> r,s
(['cg', []], ['a', [1, 2]])
>>>
更多说明:
>>> a='a'
>>> b='a'
>>> a is b
True
>>> a='啊啊啊士大夫'
>>> b='啊啊啊士大夫'
>>> a is b
False
>>> a='absfdsdfsdfs'
>>> b='absfdsdfsdfs'
>>> a is b
True
>>> a='啊啊啊士大夫'
>>> b=str(a)
>>> a is b
True
>>> c=a[:]
>>> a is c
True
>>> import copy
>>> d=copy.copy(a)
>>> a is d
True
>>> e=copy.deepcopy(a)
>>> a is e
True
>>> f=(a + ' ')[0:-1]
>>> a is f
False
>>> a==f
True
>>>
SO上解释得很好:
If you make a copy of a string itself, then the string still need not actually be copied (since it's immutable). As an optimization you could just be given back the same object again, and for most purposes that's just as good. Indeed, Python 2.7.5 and Python 3.2.5 (which are what I have installed here) both make that optimization on all three of original[:]
, str(original)
and copy.copy(original)
.
If for some obscure reason you actually want two equal strings that are not identical (perhaps to test the performance of ==
or something, I don't know), then you basically have to try to trick the Python runtime: (original + ' ')[0:-1]
or whatever.
我们来看看是什么意思:
>>> a='测试字符'
>>> b=copy.deepcopy(a)
>>> a is b
True
>>> a=[1,2]
>>> b=copy.deepcopy(a)
>>> a is b
False
>>>
可见,深拷贝对于字符串的处理都是返回相同对象,更不用说浅拷贝那三种形式了.
Core Python Programming一书中关于深浅拷贝的错误的更多相关文章
- 关于《Head First Python》一书中print_lol()函数的思考
关于<Head First Python>一书中print_lol()函数的思考 在<Head First Python>第一章中,讲述到Python处理复杂数据(以电影数据列 ...
- 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝
Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...
- Python 中的深浅拷贝
Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...
- js中的深浅拷贝
js中的深浅拷贝 js中有深拷贝.浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数.对象.数组)而言的,大概理解的就是: 浅拷贝: 拷贝出的对象c和原始对象o,c和o在key对应的val ...
- Python中的深浅拷贝
1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...
- Python基础【3】:Python中的深浅拷贝解析
深浅拷贝 在研究Python的深浅拷贝区别前需要先弄清楚以下的一些基础概念: 变量--引用--对象(可变对象,不可变对象) 切片(序列化对象)--拷贝(深拷贝,浅拷贝) 我是铺垫~ 一.[变量--引用 ...
- 挖一挖python中的深浅拷贝问题
前几天在做面试题的时候,遇到一个与Python深浅拷贝的问题,今天总结出来一个方法,能够快速判断在对一个对象复制后,新对象与原来对象是否会互相影响的方法. 先抛出结论,然后我们对结论进行验证~~~ 先 ...
- 浅谈Python中的深浅拷贝的区别
深.浅拷贝总结 深拷贝 拷贝可变数据类型,如列表容器: a = [1, 2, [3, 4]] b = copy.deepcopy(a) a 与 b 所指的列表容器的空间地址不一致,即 id(a) != ...
- python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典
深浅copy 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 import copy 2 # ######### 数字.字符串 #### ...
随机推荐
- Hive DQL详解
1.select语法 SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_c ...
- [HNOI 2002]营业额统计
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- [AH/HNOI2017]影魔
题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂. 事实上,他吞噬的诗人灵魂早已成千上万. 千百年来,他收集了各式各样的灵魂,包括诗人. 牧师. 帝王. 乞丐. 奴隶. 罪人,当然,还有英雄. 题目描 ...
- GotoAndPlay
10月3日,在杭州市西湖景区,一只小松鼠不停地接受一道道食物,花生.玉米.饼干,可谓来者不拒,憨态可掬的模样吸引了众多围观者...Description 小松鼠终于吃撑了,她决定逃离这个地方. 我 ...
- 洛谷P2388 阶乘之乘
题目背景 不告诉你-- 题目描述 求出1!*2!*3!*4!*--*n!的末尾有几个零 输入输出格式 输入格式: n(n<=10^8) 输出格式: 有几个零 输入输出样例 输入样例#1: 复制 ...
- UVA 3713 Astronauts
The Bandulu Space Agency (BSA) has plans for the following three space missions: • Mission A: Landin ...
- hdu5631 BestCoder Round #73 (div.2)
Rikka with Graph Accepts: 123 Submissions: 525 Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- [BZOJ]1003 物流运输(ZJOI2006)
挖坑,日常划水. 从BZOJ上的AC人数来看这题确实不难,但做这种题的常见思路让小C决定还是mark一下. Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才 ...
- [USACO17JAN]Subsequence Reversal序列反转
题目描述 Farmer John is arranging his NN cows in a line to take a photo (1 \leq N \leq 501≤N≤50). The he ...
- salt基本使用之二(2)
1.Event和Reactor Event是saltstack里面的对每个事件的一个记录,相比job更加底层. 一,查看Event事件 可以在master下再开一个终端执行以下命令可以查看Event事 ...