python 集合与深浅拷贝

时间:2022-04-04 19:51:00
1. set集合, 不重复, 无序
2. 深浅拷贝
1. 直接赋值, 两个变量指向同一个对象.
2. 浅拷贝:只拷贝第一层内容. copy()
3. 深拷贝:对象中的所有内容都会被拷贝一份
import copy
copy.deepcopy()


# 去重
lst = [1,2,4,7,2,5,3,5,6,7,3]
ret = set(lst)
print(ret)
# 输出: {1, 2, 3, 4, 5, 6, 7}

ret.add(1)   # 在集合中添加,但是重复的不会添加
print(ret)
# 输出: {1, 2, 3, 4, 5, 6, 7}

# 在变成列表类型
lst = list(ret)
print(lst)
# 输出: [1, 2, 3, 4, 5, 6, 7]

 

# 1. 直接赋值, 两个变量指向同一个对象
lst = ['语文','数学','英语','地理','化学']
lst1 = lst
lst1.append('物理')   # 对其中的一个进行操作, 两个都跟着变
print(lst1,lst)
# 输出: ['语文', '数学', '英语', '地理', '化学', '物理'] ['语文', '数学', '英语', '地理', '化学', '物理']
print(id(lst),id(lst1))
# 输出(例): 1729821762184 1729821762184    # 地址都是一样的,说明:两个变量指向同一个对象

 

# 2. 浅拷贝:只拷贝第一层内容 copy(),创建新对象
lst1 = ['中国','美国','俄国','法国','英国',['五大常任理事国','以及其他国家']]
lst2 = lst1.copy()      # lst1 和lst2 不是一个对象了
lst1.append('印度')
print(lst1,lst2)
# 输出: ['中国', '美国', '俄国', '法国', '英国', ['五大常任理事国', '以及其他国家'], '印度']
#       ['中国', '美国', '俄国', '法国', '英国', ['五大常任理事国', '以及其他国家']]

print(id(lst1),id(lst2))
# 输出(例): 2822165258952 2822165761352  # 地址不一样,说明: 两个变量不是指向同一个对象

lst1[5].append('印度尼西亚')
print(lst1)     # 只拷贝第一层内容,到第二层里还是可以都添加进去
print(lst2)
# 输出: ['中国', '美国', '俄国', '法国', '英国', ['五大常任理事国', '以及其他国家', '印度尼西亚']]
#       ['中国', '美国', '俄国', '法国', '英国', ['五大常任理事国', '以及其他国家', '印度尼西亚']]


# lst2 = lst1[:]  # 切片会产生新的对象,
lst1 = ['中国','美国','俄国','法国','英国',['五大常任理事国','以及其他国家']]
lst2 = lst1[:]
lst2.append('澳大利亚')
print(lst2)
print(lst1)
# 输出: ['中国', '美国', '俄国', '法国', '英国', ['五大常任理事国', '以及其他国家'], '澳大利亚']
#       ['中国', '美国', '俄国', '法国', '英国', ['五大常任理事国', '以及其他国家']]

print(id(lst1),id(lst2))
# 输出(例): 1831290561224 1831320161672   # 地址不一样,对于我来说,相当于浅拷贝

lst2[5].append('澳大利亚')
print(lst2)
print(lst1)
# 输出: ['中国', '美国', '俄国', '法国', '英国', ['五大常任理事国', '以及其他国家', '澳大利亚']]
#       ['中国', '美国', '俄国', '法国', '英国', ['五大常任理事国', '以及其他国家', '澳大利亚']]

 

# 3. 深拷贝:对象中的所有内容都会被拷贝一份
import copy

lst1 = ['变形金刚','侏罗世纪公园','街舞','学生',['老师','教授']]
lst2 = copy.deepcopy(lst1)    # 把lst1扔进去进行深度拷贝  包括内部的所有内容进行拷贝

lst1[4].append('教师')
print(lst1, lst2)
# 输出: ['变形金刚', '侏罗世纪公园', '街舞', '学生', ['老师', '教授', '教师']]
#       ['变形金刚', '侏罗世纪公园', '街舞', '学生', ['老师', '教授']]
print(id(lst1), id(lst2))
# 输出(例): 1813244593736 1813274316552

 

# 1. 为什么要有深浅拷贝?
# 因为拷贝比创建对象的过程要快