数组的初始化以及拷贝
1. 数组拷贝
浅拷贝(Shallow Copy):
- 浅拷贝创建一个新的对象,但不会复制原始对象中的子对象。
- 原始对象和浅拷贝后的对象共享相同的子对象。这意味着,如果修改了浅拷贝后的对象中的子对象,原始对象中的相应子对象也会受到影响。
- 浅拷贝通常使用一些语言提供的内建函数(如copy.copy()在Python中)来执行。
深拷贝(Deep Copy):
- 深拷贝创建一个新的对象,并且递归地复制原始对象中的子对象。这意味着原始对象和深拷贝后的对象是完全独立的,对其中一个的修改不会影响另一个。
- 深拷贝通常需要使用专门设计用于深拷贝的函数或库(如copy.deepcopy()在Python中)。
使用场景: 备份, 或者是回溯题目的时候需要深拷贝数组, 如果是浅拷贝的化那么将会为[]数组
# 推荐深拷贝 [row[:] for row in arr]
def twoDimensinalArrCopy(arr):
new_arr_shallow1 = arr # 浅拷贝 直接赋值
new_arr_shallow2 = arr[:][:] # 浅拷贝 [:][:]
new_arr_shallow3 = arr.copy() # 浅拷贝 .copy()
new_arr_deep1 = [row[:] for row in arr] # 深拷贝
arr[0][0] = 100
print(new_arr_shallow1)
print(new_arr_shallow2)
print(new_arr_shallow3)
print(new_arr_deep1)
# 推荐深拷贝 arr[:]
def oneDimensionalArrCopy(arr):
new_arr_shallow = arr # 一维数组浅拷贝
new_arr_deep = arr[:] # 一维数组深拷贝
new_arr_deep2 = arr.copy() # 一维数组深拷贝
arr[0] = 8
print(f"浅拷贝: {new_arr_shallow}")
print(f"深拷贝: {new_arr_deep}")
print(f"深拷贝: {new_arr_deep2}")
if __name__ == '__main__':
arr_one = [1, 2, 3, 4, 5, 6, 7]
arr_two = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# oneDimensionalArrCopy(arr_one) # 一维数组拷贝
# twoDimensinalArrCopy(arr_two) # 二维数组拷贝
2. 数组的初始化
2.1 初始一维数组直接
def createOneArr(length):
arr = [0] * length
return arr
2.2 初始化二维数组
这里需要注意要使用一个for循环,不然会有问题 可以自行测试
def createTwoArr(row, column):
arr = [[0] * column for _ in range(row)] # 注意行列的顺序
# arr = [[0] * column] * row # 这种是错误的 这种初始化相当于是每行都相同
return arr
def createOneArr(length):
arr = [0] * length
return arr
# 初始化一个row行, column列的二维数组
def createTwoArr(row, column):
arr = [[0] * column for _ in range(row)] # 注意行列的顺序
# arr = [[0] * column] * row # 这种是错误的 这种初始化相当于是每行都相同
return arr
if __name__ == '__main__':
# 矩阵初始化
one = createOneArr(5)
two = createTwoArr(4, 5)
print(one)
print(two)
two[0][0] = 1
print(two)
3. 总的代码
# 推荐深拷贝 [row[:] for row in arr]
def twoDimensinalArrCopy(arr):
new_arr_shallow1 = arr # 浅拷贝 直接赋值
new_arr_shallow2 = arr[:][:] # 浅拷贝 [:][:]
new_arr_shallow3 = arr.copy() # 浅拷贝 .copy()
new_arr_deep1 = [row[:] for row in arr] # 深拷贝
arr[0][0] = 100
print(new_arr_shallow1)
print(new_arr_shallow2)
print(new_arr_shallow3)
print(new_arr_deep1)
# 推荐深拷贝 arr[:]
def oneDimensionalArrCopy(arr):
new_arr_shallow = arr # 一维数组浅拷贝
new_arr_deep = arr[:] # 一维数组深拷贝
new_arr_deep2 = arr.copy() # 一维数组深拷贝
arr[0] = 8
print(f"浅拷贝: {new_arr_shallow}")
print(f"深拷贝: {new_arr_deep}")
print(f"深拷贝: {new_arr_deep2}")
# 初始化一个length的数组
def createOneArr(length):
arr = [0] * length
return arr
# 初始化一个row行, column列的二维数组
def createTwoArr(row, column):
arr = [[0] * column for _ in range(row)] # 注意行列的顺序
# arr = [[0] * column] * row # 这种是错误的 这种初始化相当于是每行都相同
return arr
if __name__ == '__main__':
arr_one = [1, 2, 3, 4, 5, 6, 7]
arr_two = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# oneDimensionalArrCopy(arr_one) # 一维数组拷贝
# twoDimensinalArrCopy(arr_two) # 二维数组拷贝
# 矩阵初始化
one = createOneArr(5)
two = createTwoArr(4, 5)
print(one)
print(two)
two[0][0] = 1
print(two)