Python深拷贝与浅拷贝
深拷贝与浅拷贝
Python中一切皆对象,对象三要素:地址、类型、值
不可变对象:字符串、元祖、数值类型
可变对象:列表、字典、集合
赋值:a = 'Python', 变量a ->引用(指针) 对象'Python'
浅拷贝:创建新对象,其内容是原对象的引用
常见的浅拷贝:切片,copy模块中的copy函数,工厂函数如list()
浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已
# 创建一个对象,是创建与引用的过程,首先创建一个对象5,5被存在内存中,有自己独立的地址空间,然后n1 指向(引用)了5
n1 = 5
# 不可变对象赋值(引用)
n2 = n1 # id(n2) == id(n1)
# 可变对象赋值(引用)
l1 = [1,2,3]
l2 = l1 # id(l2) == id(l1)
l1.append(4)
print(l1) # l1 = [1,2,3,4]
print(l2) # l2 = [1,2,3,4]
# 浅拷贝
# 浅拷贝不可变对象
import copy
n3 = 6
n4 = copy.copy(n3)
# 不可变对象通过浅拷贝,拷贝出来的对象还是原对象
print(id(n3))
print(id(n4)) # id(n3)==id(n4)
# 浅拷贝可变对象
lst1 = [1,2,[3,4]]
lst2 = lst[:]
lst3 = copy.copy(lst1)
# lst1, lst2, lst3的id地址不一样,即可变对象通过浅拷贝创建了新对象
print(id(lst1))
print(id(lst2))
print(id(lst3))
# 但列表中的元素id地址相同,说明可变对象中的子元素指向原对象,即浅拷贝只拷贝外层对象,内部子元素只是原对象的引用
print(id(lst1[2]))
print(id(lst2[2]))
print(id(lst3[2]))
深拷贝:拷贝了对象所有元素,包括多层嵌套元素,是一个全新的对象,与原来对象不再有任何关联
只有一种形式,copy模块中的deepcopy函数
# 深拷贝不可变对象
import copy
n5 = 7
n6 = copy.deepcopy(n5)
# 不可变对象即使是通过深拷贝,拷贝出来的对象还是原对象
print(id(n5))
print(id(n6)) # id(n5)==id(n6)
# 深拷贝可变对象
lst4 = copy.deepcopy(lst1)
# 可变对象通过深拷贝会创建出一个完全独立的新对象
print(id(lst1))
print(id(lst4))
print(id(lst1[-1]))
print(id(lst4[-1]))
深拷贝与浅拷贝是对于可变对象而言的,不可变对象没有拷贝这个说,不可变类型,不管是深拷贝还是浅拷贝,地址值和拷贝后的值都是一样的
选择排序
# 选择排序
nums = [5,3,6,4,1,2,8,7]
new_nums = list() # 创建新列表用于存放排序后的元素
while nums: # 当被排序对象中有值时对列表中每个元素进行比较,筛选出最小的元素
min_index = 0 # 每次都从列表中第一个元素开始跟后面每一个元素进行比较
for index in range(1, len(nums)): # 选择该列表中最小的数值
if nums[index] < nums[min_index]: # 如果后面的数值小于这个数则进行替换
min_index = index
min_num = nums.pop(min_index) # 从原列表中取出本轮循环中最小的数值
new_nums.append(min_num) # 把本轮循环获取到的最小数值存入新列表
print(new_nums)
冒泡排序
nums = [8,7,6,5,4,3,2,1]
for i in range(len(nums)-1):
for j in range(len(nums)-1-i):
if nums[j] > nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
print(nums)

2323

被折叠的 条评论
为什么被折叠?



