栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

什么时候“ i + = x”与Python中的“ i = i + x”不同?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

什么时候“ i + = x”与Python中的“ i = i + x”不同?

这完全取决于对象i。

+=调用__iadd__方法(如果存在-

__add__
如果不存在则返回),而+调用
__add__
方法1或在
__radd__
某些情况下调用方法2。

从API的角度来看,

__iadd__
应该将其用于就地修改可变对象(返回已变异的对象),而__add__应该返回某些东西的新实例。对于不可变的对象,这两种方法都返回一个新实例,但是__iadd__会将新实例放置在当前名称空间中,并具有与旧实例相同的名称。这就是为什么

i = 1i += 1

似乎在增加i。实际上,您将获得一个新的整数并将其分配给“顶部” i-丢失对旧整数的一个引用。在这种情况下,

i += 1
与完全相同
i = i + 1
。但是,对于大多数易变的物体,情况就不同了:

作为一个具体的例子:

a = [1, 2, 3]b = ab += [1, 2, 3]print a  #[1, 2, 3, 1, 2, 3]print b  #[1, 2, 3, 1, 2, 3]

相比:

a = [1, 2, 3]b = ab = b + [1, 2, 3]print a #[1, 2, 3]print b #[1, 2, 3, 1, 2, 3]

请注意,在第一个示例中,由于b和a引用相同的对象,因此当我+=在on上使用时b,它实际上发生了变化b(并且也a看到了这种变化-毕竟,它引用的是相同列表)。但是,在第二种情况下,当我这样做时

b = b + [1, 2, 3]
,它将采用b正在引用的列表并将其与新列表连接起来[1, 2, 3]。然后,它将串联的列表存储为b-而不考虑b之前的行。

1在表达式中

x + y
,如果
x.__add__
未实现或如果
x.__add__(y)
返回
NotImplemented
并且 x和y具有不同的类型,则
x + y
尝试调用
y.__radd__(x)
。所以,如果你有

foo_instance += bar_instance

如果Foo没有实现

__add__
__iadd__
那么这里的结果与

foo_instance = bar_instance.__radd__(bar_instance, foo_instance)

2在表达式中

foo_instance + bar_instance
,如果的类型是(例如)类型的子类,
bar_instance.__radd__
将在之前尝试。合理的,这是因为在某种意义上是一种“更高级”的对象不是那么应该得到压倒一切的选项的行为。
foo_instance.__add__ bar_instancefoo_instanceissubclass(Bar, Foo)BarFooBarFoo



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/379246.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号