新手学python疑惑—— 列表内容的复制
Posted DuckQuick
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新手学python疑惑—— 列表内容的复制相关的知识,希望对你有一定的参考价值。
疑惑在于 《python 程序设计(第2版) 董付国 清华大学出版社》第46页
原文是:
【列表推导式】 >>>freshfruit=[‘banana‘, ‘loganberry‘, ‘passion fruit‘] >>>aList=[w.strip() for w in freshfruit] 等价于下面的代码: >>>freshfruit=[‘banana‘, ‘loganberry‘, ‘passion fruit‘] >>>for i, v in enumerate(freshfruit): freshfruit[i]=v.strip() 同时,也等价于 >>>freshfruit=[‘banana‘, ‘loganberry‘, ‘passion fruit‘] >>>freshfruit=list(map(str.strip, freshfruit))
关键疑惑点在于最后一行代码中的 map(str.strip, freshfruit)
根据上一条随笔, map(A, B)函数是 把 B 代入 A 中 返回结果,按这个来看,那么原文应该是 把列表 freshfruit 中的元素代入 str.strip 中,可是 str.strip 是什么呢?!
先来看看这些代码输出的结果是什么:
[‘banana‘, ‘loganberry‘, ‘passion fruit‘]
结果竟然与 原来的列表(freshfruit) 内容一样
判断 id(freshfruit) == id(aList) 答案是 False
故可知道这些代码作用是 列表内容的复制,而不是内存地址的复制,即不是 ‘is’ 的关系,而是 ‘==’ 的关系。
到这里就能明白 列表的复制 不能是 A = B 这么简单,因为这样就是内存地址的相等,改变其中一个列表就会同样对另一个列表进行改变。
比如说:
>>> oldlist = [‘a‘, ‘b‘, ‘c‘] >>> newlist = oldlist >>> oldlist [‘a‘, ‘b‘, ‘c‘] >>> newlist [‘a‘, ‘b‘, ‘c‘] >>> newlist.append(‘d‘) >>> newlist [‘a‘, ‘b‘, ‘c‘, ‘d‘] >>> oldlist [‘a‘, ‘b‘, ‘c‘, ‘d‘]
改变了 newlist 也会对 oldlist 进行改变。
>>> id(oldlist) 1625304 >>> id(newlist) 1625304 >>> newlist is newlist True
内存地址一样。
那么回到原来的疑惑, str.strip 到底是什么?
到这里我才忽然明白了, 根据 strip()函数 的意思, Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。——by 菜鸟教程
而书本上的那段代码其实是这样的:
>>>freshfruit=[‘ banana ‘, ‘ loganberry ‘, ‘passion fruit ‘]
在字符前后是加了几个空格的,而不是像我最开始敲的代码一样没有空格。
★这就解释了其实书本上代码的意思是 去除空格 ,而不是我以为的 列表内容的复制★
疑惑解决!
以上是关于新手学python疑惑—— 列表内容的复制的主要内容,如果未能解决你的问题,请参考以下文章