【发布时间】: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 中看到过这样的代码:
if cnt > 0 and len(aStr) > 1:
while cnt > 0:
aStr = aStr[1:]+aStr[0]
cnt += 1
+= 是什么意思?
【问题讨论】:
a += b 与a = a + b 基本相同,除了:
+ 总是返回一个新分配的对象,但如果对象是可变的,+= 应该(但不是必须)就地修改对象(例如list 或dict,但int 和str 是不可变的)。
在a = a + b 中,a 被计算了两次。
如果这是您第一次遇到+= 运算符,您可能想知道为什么它可以就地修改对象而不是构建新对象很重要。这是一个例子:
# 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], [])
【讨论】:
+=。
a += b
在这种情况下和
一样a = a + b
在这种情况下,cnt += 1 表示 cnt 加一。
请注意,如果 cnt > 0 且 len(aStr) > 1,您粘贴的代码将无限循环。
编辑:引用Carl Meyer: ``[..] 答案在误导性方面大部分是正确的。 + 和 += 之间存在细微但非常显着的区别,请参阅 Bastien's answer。''。
【讨论】:
Google 'python += operator' 将您带到http://docs.python.org/library/operator.html
在页面加载后搜索 += 以获得更详细的答案。
【讨论】:
仅供参考:看起来您的示例中可能存在无限循环...
if cnt > 0 and len(aStr) > 1:
while cnt > 0:
aStr = aStr[1:]+aStr[0]
cnt += 1
cnt大于0cnt 大于0,循环就会继续运行cnt 递增 1最终结果是cnt总是大于 0,并且循环永远不会退出。
【讨论】:
+= 是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:
- 如果 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 它。
【讨论】:
意思是“将“THIS”附加到当前值”
示例:
a = "你好"; a += "世界";
现在打印一个将输出:“hello world”
【讨论】: