在分配字典中的值时,在Python中导致这种奇怪结果的原因是什么?

Kie*_*unt 1 python dictionary numpy variable-assignment

我最近将某些代码中的错误减少为以下行为的结果:

>>> arr = np.zeros(10)
>>> value = 0
>>> dictionary = {"key":[arr,value]}
>>> dictionary["key"][0]
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
>>> dictionary["key"][1]
0
>>> dictionary["key"][0]+=1
>>> dictionary["key"][1]+=1
>>> dictionary["key"][0]   
array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
>>> dictionary["key"][1]   
1
>>> arr
array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
>>> value
0
Run Code Online (Sandbox Code Playgroud)

导致:

>>> dictionary["key"][0] is arr
True
>>> dictionary["key"][1] is value 
False
Run Code Online (Sandbox Code Playgroud)

可能是一个愚蠢的问题,但是是什么导致了这个?

Ffi*_*ydd 5

对于numpy数组,您具有与名称和字典内分配的相同对象arr.因此,当您修改它时,您会看到两者都发生了更改,它们毕竟是同一个对象,并且numpy数组是可变的.

对于整数,当你dictionary["key"][1]+=1在字典中创建一个新的整数时,这是因为整数是不可变的 [1].这意味着两个整数(valuedictionary["key"][1])是不同的对象,因此一个被修改但另一个不是.

[1]它可能看起来像是x = 2; x += 1在同一个对象上运行,毕竟+=应该进行"就地"操作,但这不是因为不变性.在幕后,您实际上是在重新绑定x一个新的整数对象,因此它们具有相同的名称,但它们是不同的对象.