当前位置: 首页 > 面试题库 >

“ for”循环中i = i + 1和i + = 1有什么区别?

夏骏
2023-03-14
问题内容

我今天发现了一件奇怪的事情,想知道是否有人可以阐明其中的区别?

import numpy as np

A = np.arange(12).reshape(4,3)
for a in A:
    a = a + 1

B = np.arange(12).reshape(4,3)
for b in B:
    b += 1

运行完每个for循环后,A没有改变,但是B在每个元素中添加了一个。我实际上使用该B版本在for循环内写入初始化的NumPy数组。


问题答案:

不同之处在于,一个修改数据结构本身(就地操作),b += 1而另一个仅 重新分配 变量a = a + 1

仅出于完整性考虑:

x += y不是总是 做就地操作,有(至少)三种例外情况:

  • 如果x 没有实现__iadd__则方法的x += y声明仅仅是一个速记x = x + y。如果x是类似的情况就是这种情况int

  • 如果__iadd__返回NotImplemented,Python将退回到x = x + y

  • __iadd__理论上讲,该方法可以实现为无法正常运行。但是,这样做真的很奇怪。

发生时,您的bs是numpy.ndarray实现__iadd__返回自身的,因此您的第二个循环就地修改了原始数组。

您可以在Python文档“模拟数字类型”中了解更多信息。

这些[
__i*__]方法称为实现增强算术分配(+=-=*=@=/=//=%=**=<<=>>=&=^=|=)。这些方法应尝试就地执行操作(修改self)并返回结果(可以是,但不一定是self)。如果未定义特定方法,则扩展分配将退回到常规方法。例如,如果x是具有__iadd__()方法的类的实例,x += y则等效于x = x.__iadd__(y)。否则,将x.__add__(y)与和y.__radd__(x)一起评估x + y。在某些情况下,扩充分配可能会导致意外错误(请参见为什么a_tuple[i] += ["item"]加法有效时会引发异常?),但实际上,该行为是数据模型的一部分。



 类似资料:
  • 当我像下面这样写的时候 我可以得到这个输出。 输出 我认为test[0]=100->test[0]^1=101,但它不是。 你能解释一下有什么不同吗?

  • 问题内容: 和PHP 和有什么不一样? 问题答案: 是先递增,后递增。 pre-increment:先增加变量,然后取消引用。 后递增:取消引用然后递增 “利用PHP允许您进行后递增($ i )和预递增( $ i)这一事实。只要您未编写类似$ j = $ i ++的内容,其含义是相同的。预增量几乎快了10%,这意味着您应该在有机会时从后增量切换到预增量,特别是在紧密循环中,尤其是如果您对微优化感到

  • 我在英国大学考试中遇到了这个难题。 考虑以下循环,到目前为止,其中i未声明: 找到的定义,它在这个循环之前,这样time循环就会永远继续。 下一个问题,对该代码段提出了相同的问题: 对我来说是显而易见的。当然,在另一种情况下,它是NaN,但我真的被前一种情况困住了。这与溢出有关吗?是什么导致这样的循环在Java中永远循环?

  • } 链接:https://www.hackerrank.com/challenges/java-string-compare/problem

  • 和之间有什么区别? 我认识到表示矩阵的-行(平行形状),但表示矩阵的-行类似于垂直形状。 我想知道为什么显示垂直形状。

  • 问题内容: 在Java中,我通常会进行如下所示的for循环: 但是最近一位同事打了这样的字: 他说后者会更快。真的吗? 问题答案: 不,那不是真的。您可以通过定时每个循环进行大量迭代来衡量性能,但是我可以肯定它们会是相同的。 神话来自C,它被认为比C 更快,因为前者可以通过增加i然后返回来实现。后者可以通过将i的值复制到临时变量,递增i,然后返回临时变量的方式来实现。第一个版本不需要制作临时副本,