今天是中华人民共和国建立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就好了)
可以发现,现在两个列表已经完全独立,不再保持联动性。
好了,今天先教到这儿。
祝大家国庆快乐!