mask = pd.DataFrame(index=[1,2,3], data=[True, False, True])
d = {}
d[1] = mask
mask &= False
print(d[1])
我认为d [1]仍为[True,False,True],但实际上它变为[False,False,False]
为什么&=
就地进行?
如果我更改为mask = mask & False
,则d [1]不会更改。
答案 0 :(得分:1)
是分配和计算,它将更改相同的object
#mask &= False
mask = mask & False
修复
mask = pd.DataFrame(index=[1,2,3], data=[True, False, True])
d = {}
d[1] = mask.copy() # add copy here
mask &= False
print(d[1])
0
1 True
2 False
3 True
更多细节
mask = pd.DataFrame(index=[1,2,3], data=[True, False, True])
d = {}
d[1] = mask
id(mask),id(d[1]) # same object
Out[482]: (2558679905288, 2558679905288)
d[1] = mask.copy()
id(mask),id(d[1]) # diff object so change one another one stay the same
Out[484]: (2558679850184, 2558674488968)
答案 1 :(得分:1)
Pandas数据帧是指针,x=
是Python中的就地运算符。因此,当您这样做时:
mask &= False
您对mask
指向的对象进行就地操作。
但是
mask = mask & False
是不同的。 mask & False
创建一个新对象,mask = new_object
指向mask
指向新对象,而d[1]
指向mask
先前指向的对象。因此,在执行上述命令后,mask
和d[1]
是两个不同的对象。您可以在分配前后使用id(d[1]) == id(mask)
进行验证。