【问题标题】:why Numpy mutable variable such as array didn't update value on the same memory?为什么像数组这样的 Numpy 可变变量没有更新同一内存上的值?
【发布时间】:2020-11-20 05:44:20
【问题描述】:

我对 python 中的可变变量感到困惑。请看以下示例代码:

In [144]: a=[1,2,3,4]

In [145]: b=a

In [146]: a.append(5)

In [147]: a
Out[147]: [1, 2, 3, 4, 5]

In [148]: b
Out[148]: [1, 2, 3, 4, 5]

由于 list 是可变的,当使用 append 函数时,它在同一块内存上工作。这对我来说是可以理解的。但是下面的代码让我很困惑。

In [149]: import numpy as np

In [150]: a=np.random.randn(3,2)

In [151]: b=a

In [152]: a=a-1

In [153]: a
Out[153]:
array([[-2.05342905, -1.21441195],
       [-1.29901352, -3.29416381],
       [-2.28775209, -1.65702149]])

In [154]: b
Out[154]:
array([[-1.05342905, -0.21441195],
       [-0.29901352, -2.29416381],
       [-1.28775209, -0.65702149]])

由于 Numpy 数组变量也是可变的,当 a=a-1 时,为什么没有在 a 的同一内存上进行更改指的是?另一方面,a 指的是具有新价值的新记忆。
为什么变量 a 在第一个示例中没有类似的行为,即在列表中追加一个新值 5,a 仍然指向相同的内存?

【问题讨论】:

  • a=a-1 是复制分配。 a-=1 是可变的
  • a-=1 不是拷贝赋值?你能解释一下吗?谢谢。
  • 不,不是。它是增强赋值,python 对象有一个特定的方法(__isub__),numpy.ndarray 实现了

标签: python numpy mutable


【解决方案1】:

因为当您调用 a=a-1 时,您正在为变量 a 分配一个新值...然后,由于 a-1 没有就地更改 a,而是创建了该变量的整个内存分配另一个对象..

a = [1,2,3] 
b = a
a = a + [4]
a 
>>> [1,2,3,4] 
b
>>> [1,2,3]

看到了吗?它与具体的numpy无关......

【讨论】:

    【解决方案2】:

    简答:a -= 1 已就地,但a = a-1a 的内存复制到另一个位置,然后减去1。因此a最初指向的位置发生了变化。

    您可以使用is 进行检查。 is 关键字表示两个变量是否引用内存中的同一个对象,它与== 不同。

    >>> import numpy as np
    >>> a = np.random.randn(3,2)
    >>> b = a
    >>> a is b
    True
    >>> a, b
    (array([[-0.14563848,  2.11951025],
           [ 0.50913228, -0.61049821],
           [ 2.29055958, -0.83795141]]), array([[-0.14563848,  2.11951025],
           [ 0.50913228, -0.61049821],
           [ 2.29055958, -0.83795141]]))
    >>> a -= 1
    >>> a
    array([[-1.14563848,  1.11951025],
           [-0.49086772, -1.61049821],
           [ 1.29055958, -1.83795141]])
    >>> b
    array([[-1.14563848,  1.11951025],
           [-0.49086772, -1.61049821],
           [ 1.29055958, -1.83795141]])
    >>> a is b
    True
    >>> a = a - 1
    >>> a
    array([[-2.14563848,  0.11951025],
           [-1.49086772, -2.61049821],
           [ 0.29055958, -2.83795141]])
    >>> b
    array([[-1.14563848,  1.11951025],
           [-0.49086772, -1.61049821],
           [ 1.29055958, -1.83795141]])
    >>> a is b
    False
    

    【讨论】:

    猜你喜欢
    • 2015-11-25
    • 2023-02-10
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多