【发布时间】: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实现了