【问题标题】:Why id values show different outputs when I am using *= and * operators为什么当我使用 *= 和 * 运算符时 id 值显示不同的输出
【发布时间】:2021-02-09 05:36:42
【问题描述】:

python 3.9.1

m = [15, 20, 25]
print(m, id(m))

m *= 2
print(m, id(m))

m = m * 2
print(m, id(m))

我执行了这段代码,结果是


[15, 20, 25] 2375102123456
[15, 20, 25, 15, 20, 25] 2375102123456
[15, 20, 25, 15, 20, 25, 15, 20, 25, 15, 20, 25] 2375097669568

当我使用*=操作符时id值没有改变,而m = m * 2是。

这两个id变化有什么区别?

【问题讨论】:

  • 对于这个*= 2 操作,您将相同的列表扩展两次,因此 id 是相同的。现在对于这个m = m * 2 操作,您首先扩展了列表,然后传递了一个对m 的新引用。这就是为什么这个id(m) 显示不同的内存地址。

标签: python-3.x list operators


【解决方案1】:

对于m *= 2,修改是就地完成 -- 请参阅object.imul(self, other) 的文档:

调用这些方法来实现增强的算术赋值(+=、-=、*=、@=、/=、//=、%=、**=、>=, &=, ^=, |=)。这些方法应该尝试就地进行操作(修改self)并返回结果(可以是self,但不一定是self)。

这就是id(m) 返回相同值的原因。

对于m = m * 2,使用值[15, 20, 25, 15, 20, 25, 15, 20, 25, 15, 20, 25] 创建一个新对象。 然后m 引用这个新对象。

这就是id(m) 在这种情况下返回不同值的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 2020-10-03
    • 2019-10-07
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    相关资源
    最近更新 更多