给字典中的值赋值时,是什么导致 Python 出现这种奇怪的结果?
What causes this strange result in Python when assigning to values in a dictionary?
我最近将某些代码中的错误减少为以下行为的结果:
>>> 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
导致:
>>> dictionary["key"][0] is arr
True
>>> dictionary["key"][1] is value
False
可能是个愚蠢的问题,但这是什么原因造成的?
对于 numpy 数组,您有 相同的 对象分配了名称 arr
并且在您的字典中。因此,当你修改它时,你会看到两者都出现了变化,毕竟它们是同一个对象,而且 numpy 数组是 mutable.
对于整数,当您执行 dictionary["key"][1]+=1
时,您将在字典中创建一个新的整数,这是因为整数是 不可变的 [1]。这意味着两个整数(value
和 dictionary["key"][1]
)是不同的对象,因此一个被修改而另一个没有被修改。
[1] 看起来 x = 2; x += 1
是在同一个对象上操作,毕竟 +=
应该做 "in-place" 操作,但这不是因为不变性。在幕后,您实际上是用一个新的整数对象重新绑定 x
,因此它们具有相同的名称,但是是不同的对象。
答案在于 numpy 数组(可变)和整数(不可变)之间的区别。当您执行此操作时:
dictionary["key"][0]+=1
这就地改变了 numpy 数组,因此仍然是同一个对象。
当您执行此操作时:
dictionary["key"][1]+=1
不能就地改变整数(不可变),因此分配了一个新对象(这就是为什么 is
returns False
)。
我最近将某些代码中的错误减少为以下行为的结果:
>>> 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
导致:
>>> dictionary["key"][0] is arr
True
>>> dictionary["key"][1] is value
False
可能是个愚蠢的问题,但这是什么原因造成的?
对于 numpy 数组,您有 相同的 对象分配了名称 arr
并且在您的字典中。因此,当你修改它时,你会看到两者都出现了变化,毕竟它们是同一个对象,而且 numpy 数组是 mutable.
对于整数,当您执行 dictionary["key"][1]+=1
时,您将在字典中创建一个新的整数,这是因为整数是 不可变的 [1]。这意味着两个整数(value
和 dictionary["key"][1]
)是不同的对象,因此一个被修改而另一个没有被修改。
[1] 看起来 x = 2; x += 1
是在同一个对象上操作,毕竟 +=
应该做 "in-place" 操作,但这不是因为不变性。在幕后,您实际上是用一个新的整数对象重新绑定 x
,因此它们具有相同的名称,但是是不同的对象。
答案在于 numpy 数组(可变)和整数(不可变)之间的区别。当您执行此操作时:
dictionary["key"][0]+=1
这就地改变了 numpy 数组,因此仍然是同一个对象。
当您执行此操作时:
dictionary["key"][1]+=1
不能就地改变整数(不可变),因此分配了一个新对象(这就是为什么 is
returns False
)。