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

疑惑在于 《python 程序设计(第2版) 董付国 清华大学出版社》第46页

原文是:

【列表推导式】>>>freshfruit=['banana', 'loganberry', 'passion fruit']>>>aList=[w.strip() for w infreshfruit]

等价于下面的代码:>>>freshfruit=['banana', 'loganberry', 'passion fruit']>>>for i, v inenumerate(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 isnewlist

True

内存地址一样。

那么回到原来的疑惑,str.strip 到底是什么?

到这里我才忽然明白了, 根据 strip()函数 的意思, Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。——by 菜鸟教程

而书本上的那段代码其实是这样的:

>>>freshfruit=['banana', 'loganberry', 'passion fruit']

在字符前后是加了几个空格的,而不是像我最开始敲的代码一样没有空格。

★这就解释了其实书本上代码的意思是 去除空格 ,而不是我以为的 列表内容的复制★

疑惑解决!

另附上 列表推导式 的常用方法(来源书本):

①实现嵌套列表的平铺

>>>vec=[[1,2,3], [4,5,6], [7,8,9]]>>>[num for elem in vec for num inelem]

结果是:

[1,2,3,4,5,6,7,8,9]

②列出当前文件夹下所有Python源文件(以 .py 结尾的文件)

>>>importos>>>[filename for filename in os.listdir('.') if filename.endwith('.py')]

③实现矩阵转置

>>>matrix=[[1,2,3,4], [5,6,7,8], [9,10,11,12]]>>>[[row[i] for row in matrix] for i in range(4)]

结果是:

[[1,5,9], [2,6,10], [3,7,11], [4,8,12]]

也可以用 zip() 和 list() 实现矩阵转置

>>>list(zip(*matrix))

④文件对象迭代

>>>fp=open('D:/XXX.txt', 'r')>>>print([line for line in fp])

⑤生成100以内的所有素数

>>>[p for p in range(2, 100) if 0 not in [p%d for d in range(2, int(sqrt(p)) +1)]]

⑥求小于10000的同构数(这个是我以前在CSDN上写的)

from math importceilprint([i for i in range(1,10000) for n in range(len(str(i * i)),len(str(i * i)) + 1) if i == i * i % (10**(ceil(n / 2))) ])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值