gpt4 book ai didi

Python 增强赋值问题

转载 作者:太空狗 更新时间:2023-10-29 17:03:59 25 4
gpt4 key购买 nike

我遇到了一些关于 python 增广赋值的有趣事情 +=

如果 a 是“更简单”的数据类型,那么对于 a += b 似乎并不总是自动进行数据类型转换,而 a = a + b似乎总是有效

转换完成的情况

a = 1
b = 1j

a = 1
b = 0.5

未完成转换的情况

from numpy import array
a = array([0, 0 ,0])
b = array([0, 0, 1j])

a += b之后,a仍然是整数矩阵,而不是复数矩阵

我以前一直认为a += ba = a + b是一样的,到底他们在底层实现上有什么区别?

最佳答案

对于 +运算符,Python 定义了对象可以实现的三个“特殊”方法:

  • __add__ :添加两项( + 运算符)。当你做 a + b , __add__ a的方法|用 b 调用作为论点。
  • __radd__ : 反射添加;对于 a + b , __radd__ b的方法|用 a 调用作为一个例子。这仅在 a 时使用不知道如何进行添加,并且这两个对象是不同的类型。
  • __iadd__ : 就地添加;用于a += b结果被分配回左变量。这是单独提供的,因为它可能以更有效的方式实现它。例如,如果 a是一个列表,那么 a += ba.extend(b)相同.但是,在 c = a + b 的情况下你必须复制一份a在你扩展它之前 a在这种情况下不要修改。请注意,如果您不实现 __iadd__那么 Python 只会调用 __add__相反。

因此,由于这些不同的操作是用不同的方法实现的,所以有可能(但通常是不好的做法)实现它们,使它们做完全不同的事情,或者在这种情况下,可能只是略微不同的事情.

其他人推断您正在使用 NumPy 并解释了它的行为。但是,您询问了底层实现。希望您现在明白了 为什么 a += b 有时是这样的与 a = a + b 不同.顺便说一句,也可以为其他操作实现类似的方法三重奏。参见 this page获取所有受支持的就地方法的列表。

关于Python 增强赋值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4382246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com