Python列表在for循环内`+=`与直接用`+`拼接字符串的行为差异
列表操作中
+= 与 + 的行为差异解析 两段代码的运行逻辑差异
- 代码1正常输出的本质
代码里的display += "_",对列表来说触发的是原地扩展逻辑。这个操作的兼容规则是:只要传入的内容是可迭代对象,就会把内容里的每个元素拆出来,逐个追加到原列表末尾。
单字符的"_"本身是可迭代的,迭代时会取出自身的字符,因此display += "_"实际和调用display.extend("_")效果完全一致,循环2次后自然就得到包含两个"_"元素的列表。 - 代码2触发报错的本质
代码里的dis + "_",走的是列表的拼接逻辑,这个逻辑有严格的类型要求:只能和另一个列表做拼接,不接受任意其他类型的可迭代对象。直接把字符串当拼接参数,类型不匹配,就会抛出提示的拼接类型错误。
容易踩的认知误区
不少人会把
a += b当成a = a + b的简写,这个认知在Python的列表这类可变对象上是完全不成立的:
a = a + b:要求左右两边类型完全一致,运行后会生成一个全新的列表,再把新列表赋值给变量a += b:直接修改原来内存里的列表对象,只要传入的是可迭代对象,不管是什么类型,都会被拆成元素追加进去,全程不会生成新的列表对象
可以用几行代码直观看到区别:
# 验证 += 的兼容特性 demo = [] demo += "abc" print(demo) # 输出 ['a', 'b', 'c'] # 验证 + 的严格要求 demo = [] # demo + "abc" # 这行直接报类型错误 demo = demo + ["abc"] # 只有右操作数是列表才能正常运行 print(demo) # 输出 ['abc']
内容的提问来源于stack exchange,提问作者Bharti Sinha
相关产品推荐
相关产品推荐

