【问题标题】:What causes this strange result in Python when assigning to values in a dictionary?当分配给字典中的值时,是什么导致 Python 中出现这种奇怪的结果?
【发布时间】:2015-01-20 15:26:20
【问题描述】:

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

>>> 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

这可能是一个愚蠢的问题,但这是什么原因造成的?

【问题讨论】:

  • np.array 对象是可变的,int 对象不是。添加到整数实际上会创建一个新对象,添加到数组会更新旧对象。

标签: python numpy dictionary variable-assignment


【解决方案1】:

在 numpy 数组的情况下,您的 same 对象分配了名称 arr 并在您的字典中。因此,当您修改它时,您会看到两者都出现了更改,它们毕竟是同一个对象,并且 numpy 数组是可变的

对于整数,当您执行dictionary["key"][1]+=1 时,您正在字典中创建一个新整数,这是因为整数是不可变 [1]。这意味着这两个整数(valuedictionary["key"][1])是不同的对象,所以一个被修改,另一个没有被修改。

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

【讨论】:

    【解决方案2】:

    答案在于 numpy 数组(可变)和整数(不可变)之间的区别。当您执行此操作时:

    dictionary["key"][0]+=1
    

    这改变了 numpy 数组,因此仍然是同一个对象。

    当您执行此操作时:

    dictionary["key"][1]+=1
    

    这不能就地改变整数(不可变),因此分配了一个新对象(这就是is 返回False 的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 2011-09-30
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      相关资源
      最近更新 更多