Python - 列表补充(二)

🐍列表复制

数据是在编程逻辑中经常遇到的,复制意味着产生了数据的副本。大量数据在工作中其实也需要备份。列表的功能就是能够把大量的数据放在一起,但列表里的数据是可以进行增删改查的,数据一旦发生了变化,就不能回复到原来的样子了。如果还需要对原来的数据进行查验,没有备份就很难做到了。

列表复制的代码如下:

lists1 = [1,2,3,4]
lists2 = lists1
print("列表1:"+str(lists1))
print("列表2:"+str(lists2))

请添加图片描述

实际上就是将lists1的内存地址赋值给了lists2的内存地址,这与变量的引用还是有差别的。列表指向的是一个地址,当改变了地址指向的值时,两个列表的值就发生了改变。

  • 直接赋值操作

现在用直接赋值操作将lists2 = lists1这种复制做一下改变,即改变lists1中的数值。代码如下:

lists1 = [1,2,3,4]
lists2 = lists1
print("列表1:"+str(lists1))
print("列表2:"+str(lists2))
lists1[1] = 5
print("发生赋值变化后")
print("列表1:"+str(lists1))
print("列表2:"+str(lists2))

运行结果如下:
在这里插入图片描述
从运行结果上可以发现,两个列表的值都发生了改变。原因是列表指向的是列表中元素的内存地址。列表和列表发生赋值变化,实际上地址指向相同,不是又发生了一个内存空间。当改变其中一个元素内存地址中的值时,同个列表就都发生了变化,这是由内存地址中的指向没有发生改变引起的。

  • 浅复制

使用lists2 = lists1.copy()来产生复制出的列表。copy()方法就是浅复制。代码如下:

lists1 = [1,2,3,4]
lists2 = lists1.copy()
print("列表1:"+str(lists1))
print("列表2:"+str(lists2))
lists1[1] = 5
print("发生赋值变化后")
print("列表1:"+str(lists1))
print("列表2:"+str(lists2))

运行结果如下:
在这里插入图片描述
从运行结果来看,浅复制后的列表并没有改变原始数据。从原理上来说,浅复制的第一层创建的是新的内存地址,但其实只限于第一层,而从第二层开始,指向的还是同一个内存地址。所以,对于第二层及更深的层数来说,还是保持了一致性。如图所示:
请添加图片描述

浅复制产生的列表并没有产生关联的关系,对原列表或新列表进行增删改都不会对没有发生增删改数据的列表产生影响,使列表的历史数据被保留。浅复制都是对第一层地址的,只为第一层开辟空间,后面第二层或更深层都保持了一致性。如图所示:

请添加图片描述
从图中可以看出,lists1和lists2第一层都指向各自的内存地址,第二层就指向了公共的内存地址,由此可见,当第二层或更深层的数据发生改变时,他们的一致性是同步的。对于列表中含有列表这样的数据,浅复制是没有完成完全意义上的复制的。

  • 深复制

使用深复制需要导入copy模块,使用deepcopy()方法完成。代码如下:

import copy
xiyouji = ["唐僧",["孙悟空","猪八戒","沙和尚"]]
another_xiyouji = copy.deepcopy(xiyouji)
print("原始西游记:"+str(xiyouji))
print("复制西游记:"+str(another_xiyouji))
another_xiyouji[0] = "唐三藏"
print("修改第一层内容后")
print("原始西游记:"+str(xiyouji))
print("复制西游记:"+str(another_xiyouji))
another_xiyouji[1][0] = "齐天大圣"
another_xiyouji[1][1] = "猪悟能"
another_xiyouji[1][2] = "沙悟净"
print("修改第二层内容后")
print("原始西游记:"+str(xiyouji))
print("复制西游记:"+str(another_xiyouji))

运行结果如下:
在这里插入图片描述
由结果可以看出,把第一个列表的人物深复制后,深复制的列表数据更改后并没有影响到原始列表。深复制就是为列表的复制一直开辟新的内存空间。深复制后在内存中的保存形式如下图:
请添加图片描述
由此可以看出,深复制不仅在第一层开辟了新的内存地址,在第二层也同样开辟了新的内存地址,直到当前的内容指向的不再是一个地址,而是一个数值。

🐍字符串切分成列表split()方法

split()方法可以方便的按指定格式对字符串进行拆分并返回一个列表。

  • 网址的分割
urls = "www.neea.edu.cn"
nets = urls.split(".")
print(nets)

split()方法中传入了一个参数".",该参数就是进行切分的依据。
split()方法的语法格式如下:

strs.split(str = " ",num = string.count(str))[n]

其中,strs就是字符串变量的名字,第一个参数str = " “表示分隔符,默认为空格,但不能为空(”")。若字符串中没有分隔符,则整个字符串作为列表的第一个元素。第二个元素num表示分隔次数,分割成num+1个字符串。[n]表示选取第n个切片。

分割的字符串还可以通过几个变量来接收,如用host来接收第一个字符串,代表主机;用domain来接收第二个字符串,代表主域名;用orig来接收第三个字符串,代表组织;用area来接收第四个字符串,代表地区。代码如下:

urls = "www.neea.edu.cn"
host,domain,orig,area = urls.split(".")
print(host,domain,orig,area)
  • 统计字符串中某个字符个数

split()方法是对字符串进行切割,功能不能改变,但是可以吧一个字符串按照某一字符切割后,计算得到的列表的长度减一就是这个字符在这个字符串中出现的次数。
如计算“楼前相望不相知,陌上相逢讵相识?”这句诗中“相”的个数。具体代码如下:

strs = "楼前相望不相知,陌上相逢讵相识?"
shi_counts = strs.split("相")
print(shi_counts)
print("诗中相的个数为" + str(len(shi_counts)-1))

运行结果如下:
在这里插入图片描述

🐍查找某个元素在列表中的个数

可以使用count()方法,如:

list1 = [121,232,343,454,121,565,121,676]
print(list1.count(121))

今天的内容就到这里,拜了个拜~

评论 1 您还未登录,请先 登录 后发表或查看评论
相关推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:黑客帝国 设计师:我叫白小胖 返回首页

打赏作者

史迪崽儿

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值