码迷,mamicode.com
首页 > 编程语言 > 详细

新手学python疑惑(一)—— 列表内容的复制

时间:2018-07-13 13:22:26      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:字符串   会同   under   pre   改变   相等   根据   序列   新手学   

疑惑在于 《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疑惑(一)—— 列表内容的复制

标签:字符串   会同   under   pre   改变   相等   根据   序列   新手学   

原文地址:https://www.cnblogs.com/Duck-Quick/p/9304194.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!