【问题标题】:*= multiplier question between arrays and integers [duplicate]*=数组和整数之间的乘数问题[重复]
【发布时间】:2021-08-28 04:58:33
【问题描述】:

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

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 被分配给一个数组,然后是一个整数?还是打印语句顺序的问题? 这可能是微不足道的,但我只是好奇,谢谢!

【问题讨论】:

  • 您是在问为什么ab 具有相同的值,或者为什么a * 2a 中的值加倍?
  • 为什么 a 和 b 在第二个实例(但不是第一个)中具有相同的值
  • @spokati 在两者中,最初是 a 和 b 并引用同一个对象。在第一个整数中,通过返回一个新的整数对象来处理 *=,因此 a 和 b 现在是不同的。在第二个 numpy 数组中处理*=,方法是修改数组并返回相同的对象,因此 a 和 b 仍然引用相同的(修改后的)数组
  • 除了教程,你还应该有一本像样的python书,还有numpy文档,以numpy.org/doc/stable/user/absolute_beginners.html开头

标签: python numpy numpy-ndarray


【解决方案1】:

您的问题的简单答案是,

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

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

Mutable(Modifiable) Object:列表、字典、集合、字节数组、用户自定义类。

因此,在您的情况下,首先 a 和 b 是不可变对象,因为它属于 python 中的类 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

【讨论】:

  • 我的意思是,内存的管理方式并没有不同,它的处理方式完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2011-12-01
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
相关资源
最近更新 更多