当赋值和增强不同时:探索“i = x”与“i = i x”
= 运算符的使用Python 在某些情况下可能会导致意外行为。让我们检查 i = x 和 i = i x 之间的差异,以了解它们何时发散。
理解运算符重载
= 运算符调用 iadd 方法(如果存在),或者 add 方法(如果) iadd 不可用。相反,该运算符主要调用 add 方法。
可变对象与不可变对象
= 的行为取决于对象是否是分配是可变的(可以更改)或不可变的(不能更改)。对于不可变对象,= 和创建一个新实例。然而,iadd修改了原始对象并将其赋回变量名,覆盖了之前的引用。
示例:Lists
来说明差异,请考虑以下代码:
a = [1, 2, 3] b = a b += [1, 2, 3] print(a) # [1, 2, 3, 1, 2, 3] print(b) # [1, 2, 3, 1, 2, 3]
由于列表是可变的,因此 = 会修改b 到位,这会影响 a,因为两个变量引用相同的列表。
现在,考虑:
a = [1, 2, 3] b = a b = b + [1, 2, 3] print(a) # [1, 2, 3] print(b) # [1, 2, 3, 1, 2, 3]
在这种情况下,b = b [1, 2, 3] 创建一个新名单,保持不变。这是因为调用 add 方法,该方法返回一个新实例。
' =' 的异常处理
在 x. __add__ 未实现或返回 NotImplemented,并且 x 和 y 具有不同的类型,运算符将依赖 y.__radd__(如果存在)。因此,以下是等效的:
foo_instance += bar_instance
foo_instance = bar_instance.__radd__(bar_instance, foo_instance)
子类重写
当 foo_instance 和 bar_instance 是不同类型,并且 bar_instance 是 foo_instance 的子类时, bar_instance.__radd__ 将在 foo_instance.__add__ 之前尝试。这允许子类覆盖其超类的行为。
结论
理解 i = x 和 i = i x 之间的差异对于避免 Python 编程中出现意外结果至关重要。通过了解这些运算符何时以及如何表现不同,您可以有效地操作不可变和可变对象。
以上是什么时候`i = x`和`i = i x`在Python中产生不同的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!