IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> numpy array的深浅拷贝 & python list的深浅拷贝 -> 正文阅读

[数据结构与算法]numpy array的深浅拷贝 & python list的深浅拷贝

参考numpy array的深浅拷贝 & python list的深浅拷贝

python list的深浅拷贝

  • list2=list1 是赋值操作,不是拷贝。两个是同一个对象的引用。故而同变化
  • list2=list1.copy()是浅拷贝,相当于list2引用一个新对象,然后把list1中的值拷贝到这个新对象中。但是如果list1=[1,[1,2],3]包含嵌套,嵌套第一层拷贝过去的是值,第二层保存的实际是地址,所以拷贝过去的也是地址,这样修改list2[1][0]=3的话,实际上list1的相应的值也会发生改变。
  • 使用列表推导式list2=[i for i in list1]同list1.copy(),相当于第一层是深拷贝,内层由于保存的是地址,属于浅拷贝。
  • 使用for循环,逐个将list1中元素append到list2中,同列表推导式
  • 使用切片list2=list1[1:]虽然也是生成新的list,但是同样对内层是浅拷贝。
  • list2=copy.deepcopy(list1)真正深拷贝
import copy
# list2 = list1 是赋值操作,不是拷贝。两个是同一个对象的引用。故而同变化
list1 = [1,2,[3,4]]
list2 = list1

print("list1:", list1)
print("list2:", list2)
print("id of list1: ", id(list1))
print("id of list2: ", id(list2))

# list1: [1, 2, [3, 4]]
# list2: [1, 2, [3, 4]]
# id of list1:  140280809364232
# id of list2:  140280809364232
# list1和list2的内存地址相同

# list3 = list1.copy() 是浅拷贝,相当于list3引用一个新对象,然后把list1中的值拷贝到这个新对象中。
# 但是如果list1包含嵌套,嵌套第一层拷贝过去的是值,第二层保存的实际是地址,所以拷贝过去的也是地址。
# 即父对象(第一层)会拷贝到新内存地址,list1和list3子对象的值共享同一个内存地址
# 这样修改list3中子对象的值,实际上list1的相应的值也会发生改变。
list3 = list1.copy()
print("list3:", list3)
print("id of list3: ", id(list3))

# list3: [1, 2, [3, 4]]
# id of list3:  140138501900872
list3[0] = 11
list3[2][0] = 88
print("list3:", list3)
print("list1:", list1)

# list3: [11, 2, [88, 4]]
# list1: [1, 2, [88, 4]]
# list3的父对象改变,list1不变,list3的子对象改变,list1改变

# 使用列表推导式list4 = [i for i in list1]  同list1.copy(),
# 相当于第一层是深拷贝,内层由于保存的是地址,属于浅拷贝。
list4 = [i for i in list1]
print("id of list4: ", id(list4))
print("list1:", list1)
print("list4:", list4)
list4[1] = 22
list4[2][0] = 99
print("list4:", list4)
print("list1:", list1)

# id of list4:  140388211605448
# list1: [1, 2, [88, 4]]
# list4: [1, 2, [88, 4]]
# list4: [1, 22, [99, 4]]
# list1: [1, 2, [99, 4]]

# 使用for循环,逐个将list1中元素append到list5中,同列表推导式
list5 = []
for i in list1:
    list5.append(i)

print("id of list5: ", id(list5))
print("list5:", list5)

list5[1] = 55
list5[2][0] = 77
print("list5:", list5)
print("list1:", list1)

# 使用切片list6 = list1[1:]虽然也是生成新的list,但是同样对内层是浅拷贝。
list6 = list1[1:]
print("id of list6: ", id(list6))
print("list6:", list6)

list6[0] = 6
list6[1][0] = 66
print("list6:", list6)
print("list1:", list1)

# id of list6:  140448220840520
# list6: [2, [77, 4]]
# list6: [6, [66, 4]]
# list1: [1, 2, [66, 4]]

# list7 = copy.deepcopy(list1) 真正深拷贝。无论是父对象还是子对象,都会开辟新的内存
list7 = copy.deepcopy(list1)

print("id of list7: ", id(list7))
print("list7:", list7)

list7[0] = 7
list7[2][0] = 777
print("list7:", list7)
print("list1:", list1)

# id of list7:  139688264652488
# list7: [1, 2, [66, 4]]
# list7: [7, 2, [777, 4]]
# list1: [1, 2, [66, 4]]

numpy array的深浅拷贝

在这里插入图片描述

  • 数组切片是原始数组的视图,这意味着数据不会被复制,视图上的任何修改都会被直接反映到源数组上.

  • array1,array2,array3,array4实际指向同一个内存值,任意修改其中的一个变量,其他变量值都会被修改。

  • 若想要得到的是ndarray切片的一份副本而非视图,就需要显式的进行复制操作函数copy()
    array5=array1.copy() #对原始的array1的复制
    array6=array1[1:4].copy() #对切片array1[1:4]的复制
    那么,修改array5或array6,就不会影响array1。

Numpy 的 View 和 Copy可参考Numpy 的 View 和 Copy

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-08 12:01:22  更:2021-10-08 12:02:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 10:00:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码