【问题标题】:What does += mean in Python?+= 在 Python 中是什么意思?
【发布时间】:2010-10-23 20:09:29
【问题描述】:

我在 Python 中看到过这样的代码:

    if cnt > 0 and len(aStr) > 1:
        while cnt > 0:                  
            aStr = aStr[1:]+aStr[0]
            cnt += 1

+= 是什么意思?

【问题讨论】:

    标签: python syntax


    【解决方案1】:

    a += ba = a + b 基本相同,除了:

    • + 总是返回一个新分配的对象,但如果对象是可变的,+= 应该(但不是必须)就地修改对象(例如listdict,但intstr 是不可变的)。

    • a = a + b 中,a 被计算了两次。

    • Python: Simple Statements

      • 一个简单的语句包含在一个逻辑行中。

    如果这是您第一次遇到+= 运算符,您可能想知道为什么它可以就地修改对象而不是构建新对象很重要。这是一个例子:

    # two variables referring to the same list
    >>> list1 = []
    >>> list2 = list1
    
    # += modifies the object pointed to by list1 and list2
    >>> list1 += [0]
    >>> list1, list2
    ([0], [0])
    
    # + creates a new, independent object
    >>> list1 = []
    >>> list2 = list1
    >>> list1 = list1 + [0]
    >>> list1, list2
    ([0], [])
    

    【讨论】:

    • 次要更正:如果对象支持 __iadd__() 方法,则会发生就地修改,而不是如果它是可变的。特别是字典不支持+=
    • @Rafal:很明显,如果一个对象不支持 +=,就不会发生就地修改 :-) 微妙的一点是不能保证支持 += 的可变对象会在-place 修改 - 仔细的代码将避免依赖它,除非它被明确记录。
    • 我一直认为就地修改会造成不必要的混乱。
    【解决方案2】:
    a += b
    

    在这种情况下

    一样
    a = a + b
    

    在这种情况下,cnt += 1 表示 cnt 加一。

    请注意,如果 cnt > 0 且 len(aStr) > 1,您粘贴的代码将无限循环。

    编辑:引用Carl Meyer: ``[..] 答案在误导性方面大部分是正确的。 + 和 += 之间存在细微但非常显着的区别,请参阅 Bastien's answer。''。

    【讨论】:

    • 它也适用于其他运营商。你可以做 x -= 1; y *= 3; z /= 10; cnt += 1;可以认为比 cnt = cnt + 1 更整洁;哪里有更多的错字空间;)
    • @S.Lott:不赞成票意味着答案没有帮助,这个答案是。你只是因为他没有链接到文档而否决了它?
    • -1 因为答案在误导性上大部分是正确的。 + 和 += 之间存在细微但非常显着的区别,请参阅 Bastien 的回答。
    【解决方案3】:

    Google 'python += operator' 将您带到http://docs.python.org/library/operator.html

    在页面加载后搜索 += 以获得更详细的答案。

    【讨论】:

    • 或者你可以告诉他这意味着 a = a + b
    • 并让他回来询问“什么是 -=?” '什么是*=?' :) 不用了,谢谢。无论如何,在我发布之前,投票最多的人已经这样做了。
    • +1 用于提供链接(有帮助),但 -1 用于不总结,您可以在一句话中完成。净:0
    • 这对我也很有帮助。谢谢。
    【解决方案4】:

    仅供参考:看起来您的示例中可能存在无限循环...

    if cnt > 0 and len(aStr) > 1:
        while cnt > 0:                  
            aStr = aStr[1:]+aStr[0]
            cnt += 1
    
    • 进入循环的一个条件是cnt大于0
    • 只要cnt 大于0,循环就会继续运行
    • 循环的每次迭代将cnt 递增 1

    最终结果是cnt总是大于 0,并且循环永远不会退出。

    【讨论】:

    • 不一定永远 - 如果 cnt 是一个 int,它最终会溢出并变为负数,因此如果你在一台具有 32 位 int 的机器上,循环将在数十亿次迭代后最终退出(或者如果您使用的是具有 64 位整数的机器,则在宇宙热寂前后的某个时间。)
    • @Charlie:Python 会自动处理溢出。使用 Python 2.5 测试:sys.maxint + 1 == 2147483648L 和 isinstance(sys.maxint + 1, int) == False。从 Python 3.0 开始,int 和 long 之间的区别甚至消失了(不再是 long,int 是一个 'bignum')。
    • (显然在64位上我们有sys.maxint + 1 == 9223372036854775808L,但重点是结果会自动转换为long)
    【解决方案5】:

    +=in-place addition operator

    这与cnt = cnt + 1 相同。例如:

    >>> cnt = 0
    >>> cnt += 2
    >>> print cnt
    2
    >>> cnt += 42
    >>> print cnt
    44
    

    该运算符的使用方式与 C-ish 语言中的 ++ 运算符类似,用于在循环中将变量加一 (i += 1)

    减法/乘法/除法/幂等也有类似的运算符:

    i -= 1 # same as i = i - 1
    i *= 2 # i = i * 2
    i /= 3 # i = i / 3
    i **= 4 # i = i ** 4
    

    += 运算符也适用于字符串,例如:

    >>> s = "Hi"
    >>> s += " there"
    >>> print s
    Hi there
    

    出于性能原因,人们倾向于建议不要这样做,但对于大多数脚本来说,这确实不是问题。引用"Sequence Types" docs

    1. 如果 s 和 t 都是字符串,则某些 Python 实现(例如 CPython)通常可以对 s=s+t 或 s+=t 形式的赋值执行就地优化。如果适用,这种优化会大大降低二次运行时间的可能性。这种优化既依赖于版本,也依赖于实现。对于性能敏感的代码,最好使用 str.join() 方法,该方法可确保跨版本和实现的线性连接性能一致。

    str.join() 方法是指执行以下操作:

    mysentence = []
    for x in range(100):
        mysentence.append("test")
    " ".join(mysentence)
    

    ..而不是更明显的:

    mysentence = ""
    for x in range(100):
        mysentence += " test"
    

    后者的问题是(除了前导空格),取决于 Python 实现,Python 解释器必须在每次追加时在内存中制作字符串的新副本(因为字符串是不可变的),要追加的字符串越长,它就会越慢。而追加到列表然后将其连接到字符串中是一致的速度(无论实现如何)

    如果您正在执行基本的字符串操作,请不要担心。如果您看到一个基本上只是附加到字符串的循环,请考虑构造一个数组,然后"".join()'ing 它。

    【讨论】:

      【解决方案6】:

      意思是“将“THIS”附加到当前值”

      示例:

      a = "你好"; a += "世界";

      现在打印一个将输出:“hello world”

      【讨论】:

      • 看在撒旦的份上,请不要用它来构建字符串。 StringIO 和 cStringIO 就是为了这个目的。
      • 构建字符串:"".join( ITERABLE_OF_STRINGS ) 也表现良好。
      • 这意味着在字符串上使用时追加.. "".join() 性能更好,但将其用于示例中的短字符串是愚蠢的。在循环中连接字符串时使用 "".join(),但对于其中一种用途,+= 很好
      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 2013-05-20
      • 1970-01-01
      • 2015-02-13
      • 2011-08-12
      • 2017-06-11
      • 2018-03-05
      • 2023-03-27
      相关资源
      最近更新 更多