*= 数组和整数之间的乘数问题

*= multiplier question between arrays and integers

我正在尝试通过一些教程学习编码,但在复习运算符时遇到了一些奇怪的事情。我得到了基本的,但其他一些(比如这里的 *=)让我失望。

a = 1 
b = a 
a *= 2 
print(a)
print(b)

输出

2
1

但是当a是一个数组时,会出现这样的情况:

a = np.array([1, 2, 3, 3, 5, 5])
b = a
a *= 2
print(a)
print(b)

输出

[2 4 6 6 10 10]
[2 4 6 6 10 10]

知道为什么会发生这种情况吗?我真的找不到太多关于它的信息。我唯一遇到的是“强制规则”;第二个实例发生是因为 a 被分配给一个数组然后又被分配给一个整数吗?还是打印语句顺序的问题? 这可能是微不足道的,但我只是好奇,谢谢!

您问题的简单答案是,

Python中有两种对象:可变对象和不可变对象。可变对象的值可以在创建后就地修改,而不可变对象的值不能更改。

不可变(不可修改)对象: int、float、long、complex、string tuple、bool

Mutable(Modifiable) Object: list, dict, set, byte array, user-defined classes.

所以,在你的情况下,首先 a 和 b 是不可变对象,因为它属于 python 中的 class int,"b=a" 表示 b 指向一个地址,并且作为您将 a 的值更新为 a*=2,该值存储在新的内存位置,但 b 仍指向旧地址,这就是为什么 b 没有显示 a 的更改值。

想了解更多python中的内存管理,请阅读这篇博文,谢谢:) https://medium.com/@tyastropheus/tricky-python-i-memory-management-for-mutable-immutable-objects-21507d1e5b95