有人告诉我,+=效果可能与的标准符号不同i = i +。是否有与以下情况i += 1不同的情况i = i + 1?
这完全取决于对象i。
+=调用__iadd__方法(如果存在- __add__
如果不存在则返回),而+调用__add__
方法1或在__radd__
某些情况下调用方法2。
从API的角度来看,__iadd__
应该将其用于就地修改可变html" target="_blank">对象(返回已变异的对象),而__add__应该返回某些东西的新实例。对于不可变的对象,这两种方法都返回一个新实例,但是__iadd__会将新实例放置在当前名称空间中,并具有与旧实例相同的名称。这就是为什么
i = 1
i += 1
似乎在增加i。实际上,您将获得一个新的整数并将其分配给“顶部” i-丢失对旧整数的一个引用。在这种情况下,i += 1
与完全相同i = i + 1
。但是,对于大多数易变的物体,情况就不同了:
作为一个具体的例子:
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]
相比:
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和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
问题内容: 以下Java程序平均需要0.50秒至0.55秒的时间运行: 如果我替换为,则需要0.60到0.65秒的时间来运行。怎么会? 我对该程序的每个版本运行了15次,两次交替运行。结果如下: 最快的运行时间比最慢的运行时间长。如果它们具有相同的效率,则发生这种情况的可能性将小于。 问题答案: 字节码的顺序略有不同。 : vs : 乍看之下,这没有什么区别;如果有的话,第二个版本更理想,因为它减
问题内容: 在javascript中,我看到过在很多情况下都使用过它,并且我知道它会为前面的值添加一个: 但是当我这样做时会发生什么: 并且使用运算符有什么不同(当然,它是减法而不是加法)? 问题答案: 和之间的区别是表达式的值。 该值是增量之前的值。的值是增量后的值。 例: 在与运营商的工作方式相同。
问题内容: 哪个更正确?Java的结果为12或C =13。或者,如果不是正确性,请详细说明。 问题答案: 没有比这更正确的了。它实际上是未定义的,称为序列点错误。 http://en.wikipedia.org/wiki/Sequence_point
问题内容: 和PHP 和有什么不一样? 问题答案: 是先递增,后递增。 pre-increment:先增加变量,然后取消引用。 后递增:取消引用然后递增 “利用PHP允许您进行后递增($ i )和预递增( $ i)这一事实。只要您未编写类似$ j = $ i ++的内容,其含义是相同的。预增量几乎快了10%,这意味着您应该在有机会时从后增量切换到预增量,特别是在紧密循环中,尤其是如果您对微优化感到
问题内容: 我知道前缀和posfix操作… i和i 之间的区别等等。 但是我想我在这里想不到的东西。在下面可以找到代码: 因此输出为: 我在C中尝试了相同的代码: 输出为: 为什么在C中相同的代码增加值时却不增加? 问题答案: 爪哇 在Java中,表达式具有明确定义的含义。复合赋值运算符的规范说: 形式为 E1 op = E2 的复合赋值表达式等效于 E1 =(T)((E1)op(E2)) ,其中
问题内容: 我在一个开始从事的项目中遇到了这段代码。原始开发人员不再可用,我对此一无所知: 产生值为。这是如何运作的? 什么是运算符? 什么是运算符? 什么是运算符? 什么是运算符? 问题答案: 什么是运算符? 那是两个运算符,一个是赋值运算符,一个是一元加号,它什么都不做。 您是否输入错了并表示compund赋值运算符? 什么是运算符? 还有两个运算符,一个为后递增,一个为加法(根据最大划分规则