首页 > 解决方案 > 内存管理 - [浅拷贝/深拷贝/分配] 整数 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!

标签: pythonlistdataframememory-managementinteger

解决方案


推荐阅读