python - 内存管理 - [浅拷贝/深拷贝/分配] 整数 vs DataFrame/List
问题描述
a) 数据帧/列表 -正如预期的那样,对深拷贝的操作不会影响原始数据帧和分配/浅拷贝确实会影响。
数据框
import pandas as pd
df = pd.DataFrame(data=[10, 20, 30, 40, 50], columns=['data'])
df_a = df
df_b = df.copy(deep=True)
df_a['data'] = df_a['data']+100
df_b['data'] = df_b['data']+1000
df
data
0 110
1 120
2 130
3 140
4 150
df_a
data
0 110
1 120
2 130
3 140
4 150
df_b
data
0 1010
1 1020
2 1030
3 1040
4 1050
列表
import copy
c_, b_ = [10, 20], [30, 40]
a_ = b_
d_ = copy.deepcopy(c_)
a_[0] = a_[0] + 1 ## Individual element operations affect the original.
a_ = a_ + [150, 240] ## Overall List operation is Independent of original.
d_[0] = d_[0] + 100
print(a_,' : ',b_,' : ',c_,' : ',d_)
[31, 40, 150, 240] : [31, 40] : [10, 20] : [110, 20]
b)然而,当涉及到整数 时,即使赋值或浅拷贝也提供相同的功能,即对原始变量没有影响
import copy
c, b = 10, 10
a = b ## Assignment
e = copy.copy(b) ## Shallow Copy
a+=1
e+=2
d = copy.deepcopy(c)
d+=1
print(a,' : ',b,' : ',c,' : ',d,' : ',e)
# Expected output -> 13 : 13 : 10 : 11 : 13
# 'b' value unaffected by an operation made on 'a' or 'e' since they have different memory addresses
11 : 10 : 10 : 11 : 12
这篇文章链接很好地解释了DataFrame & List 的预期行为,但是当涉及到整数时,为什么同样不适用?
# reason for output is-
print(id(b), id(a), id(e))
94722916555552 94722916555584 94722916555616
# Although Shouldn't the Above Assignment operation 'a = b' OR
# e = copy.copy(b) [Shallow Copy] cause them (a, b, e) to have the same memory address?
# If not, then why so? & is there any way to make that happen?
Danke schön!
解决方案
推荐阅读
- json - 如何在不截断数据的情况下将 CLOB 列迁移到 DB2 中的 (json) BLOB?
- wordpress - 警告:mysqli_real_connect():(HY000/1698):用户'root'@'localhost'的访问被拒绝 - Docker
- api - 如何在 Android Studio 中解决已弃用的 API 错误
- c++ - 如何将节点添加到链表
- xcode - 如何使用 Swift 包管理器从 repo 中排除文件/文件夹?
- angular - 如何消除在 html 中将字符串属性括在引号中的需要——Nativescript Angular
- python - 在 Python 中将文件路径作为变量
- javascript - 猴子补丁 JavaScript new Date()
- elasticsearch - 在弹性搜索中搜索对象数组
- gradle - Gradle 插件在哪里?