我与你,一同学Python(23)

今天是中华人民共和国建立73周年。首先祝祖国生日快乐!

73年来,您披荆斩棘,开创了一片赤色天地;73年来,您迅速发展,变成了世界强大国家;73年来,您爱民如子,哺育了十四亿的人民……

我相信,在不久的将来,中国将屹立于世界之巅,挥舞着那面五星红旗!

好了,言归正传。

今天学列表的复制(想不到吧!列表能复制!)。

举个例子。

在几年以前,我没养龟,我朋友也没养龟。几年前(据他所述是他五年级时),我朋友养了只巴西龟。第二年,我养了只中华草龟。

我们可以用程序来表示这个状况。

#Program_106

my_turtle_list = []
my_friend_turtle_list = my_turtle_list    #我和朋友的宠物龟类列表

print("2021年以前,我和朋友的养龟情况:")
print("我没养龟" if my_turtle_list == [] else f"我养了{my_turtle_list}")
print("我朋友没养龟" if my_friend_turtle_list == [] else f"我朋友养了{my_friend_turtle_list}")    #输出2021年以前我和朋友的养龟情况

my_friend_turtle_list.append("巴西龟")
print("2021年春,我和朋友的养龟情况:")
print("我没养龟" if my_turtle_list == [] else f"我养了{my_turtle_list}")
print("我朋友没养龟" if my_friend_turtle_list == [] else f"我朋友养了{my_friend_turtle_list}")    #输出2021年春我和朋友的养龟情况

my_turtle_list.append("中华草龟")
print("2021年秋,我和朋友的养龟情况:")
print("我没养龟" if my_turtle_list == [] else f"我养了{my_turtle_list}")
print("我朋友没养龟" if my_friend_turtle_list == [] else f"我朋友养了{my_friend_turtle_list}")    #输出2021年秋我和朋友的养龟情况


"""
控制台:
2021年以前,我和朋友的养龟情况:
我没养龟
我朋友没养龟
2021年春,我和朋友的养龟情况:
我养了['巴西龟']
我朋友养了['巴西龟']
2021年秋,我和朋友的养龟情况:
我养了['巴西龟', '中华草龟']
我朋友养了['巴西龟', '中华草龟']
"""

这个print函数中条件判断语句中的字符串是省略了return关键词。以后我们会将这个关键词。

我们发现,这个跟我所说的情况不符。这是为什么呢?

看这行代码:my_friend_turtle_list = my_turtle_list

这是什么意思呢?这是复制的意思。说明将my_turtle_list的地址复制给my_friend_turtle_list。

这个地址是什么呢?地址是Python中任何一个对象在电脑中存储的位置。我们改动对象,电脑会现寻找这个对象的地址,然后更改。

因为这儿两个列表的地址相同,所以只要动一个,另一个也会跟着动。

那怎么办呢?很简单。

只需要懂一点点“手脚”:

#Program_106_1

my_turtle_list = []
my_friend_turtle_list = my_turtle_list[:]    #我和朋友的宠物龟类列表

print("2021年以前,我和朋友的养龟情况:")
print("我没养龟" if my_turtle_list == [] else f"我养了{my_turtle_list}")
print("我朋友没养龟" if my_friend_turtle_list == [] else f"我朋友养了{my_friend_turtle_list}")    #输出2021年以前我和朋友的养龟情况

my_friend_turtle_list.append("巴西龟")
print("2021年春,我和朋友的养龟情况:")
print("我没养龟" if my_turtle_list == [] else f"我养了{my_turtle_list}")
print("我朋友没养龟" if my_friend_turtle_list == [] else f"我朋友养了{my_friend_turtle_list}")    #输出2021年春我和朋友的养龟情况

my_turtle_list.append("中华草龟")
print("2021年秋,我和朋友的养龟情况:")
print("我没养龟" if my_turtle_list == [] else f"我养了{my_turtle_list}")
print("我朋友没养龟" if my_friend_turtle_list == [] else f"我朋友养了{my_friend_turtle_list}")    #输出2021年秋我和朋友的养龟情况


"""
控制台:
2021年以前,我和朋友的养龟情况:
我没养龟
我朋友没养龟
2021年春,我和朋友的养龟情况:
我没养龟
我朋友养了['巴西龟']
2021年秋,我和朋友的养龟情况:
我养了['中华草龟']
我朋友养了['巴西龟']
"""

可以看到,我在第四行的my_turtle_list后面加了[:]。还记的[:]是什么意思吗?

就是从开头到结尾。在这儿是什么意思呢?

就是把列表内容复制给my_friend_turtle_list,而地址不复制。

这样我们就可以肆无忌惮随心所欲地修改列表了。

哦对了,给你们介绍一个函数:id

他可以返回对象的地址。

>>> id(1)
8791569143568
>>> id(1.0)
47894896
>>> id("")
5448432

好了,我们继续。

其实列表的复制并不止于赋值,还有两种方法:浅复制和深复制。

先看浅复制。

#Program_107

list1 = [1, 2, 3, 4, 5]    #将[1, 2, 3, 4, 5]赋值给列表list1
list2 = list1.copy()    #将列表list1浅复制给列表list2
print(id(list1), id(list2))    #输出列表list1和列表list2的地址
list1.append(6)    #在列表list1的末尾添加6
list2.insert(0, 0)    #在列表list2的0号处添加0
print(list1, list2)    #输出列表list1和列表list2


"""
控制台:
139836817466816 139836816018048
[1, 2, 3, 4, 5, 6] [0, 1, 2, 3, 4, 5]
"""

乍一看列表地址不同(认为相同的仔细看),修改也没有问题。但——

#Program_107_1

list1 = [1, 2, [3, 4, 5]]    #将[1, 2, [3, 4, 5]]赋值给列表list1
list2 = list1.copy()    #将列表list1浅复制给列表list2
print(id(list1), id(list2))    #输出列表list1和列表list2的地址
list1[2].append(6)    #在列表list1子列表的末尾添加6
list2[2].insert(0, 2.5)    #在列表list2子列表的0号处添加0
print(list1, list2)    #输出列表list1和列表list2


"""
控制台:
140459621190272 140459621161088
[1, 2, [2.5, 3, 4, 5, 6]] [1, 2, [2.5, 3, 4, 5, 6]]
"""

又有问题了……

这是因为,copy方法会导致子容器(包括列表及以后要讲的元组、字典、集合)联动。

那除了赋值,怎么办呢?莫慌~

还有深复制!

深复制需要导入库copy。

#Program_107_2

import copy    #导入copy库

list1 = [1, 2, [3, 4, 5]]    #将[1, 2, [3, 4, 5]]赋值给列表list1
list2 = copy.deepcopy(list1)    #将列表list1深复制给列表list2
print(id(list1), id(list2))    #输出列表list1和列表list2的地址
list1[2].append(6)    #在列表list1子列表的末尾添加6
list2[2].insert(0, 2.5)    #在列表list2子列表的0号处添加0
print(list1, list2)    #输出列表list1和列表list2


"""
控制台:
140046228388352 140046228388608
[1, 2, [3, 4, 5, 6]] [1, 2, [2.5, 3, 4, 5]]
"""

(其实浅复制也可以用copy库,把deepcopy换成copy就好了)

可以发现,现在两个列表已经完全独立,不再保持联动性。

好了,今天先教到这儿。

祝大家国庆快乐!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值