Python中列表的+=操作为何与完整+形式运行效果不同?
核心原因:两种写法的底层执行逻辑完全不同
display = display + "_"走的是普通加法运算逻辑:Python里列表的+运算符有严格的类型限制,仅支持两个列表做拼接操作,当左边是列表、右边是字符串时,类型校验直接失败,还没到赋值步骤就会抛出类型错误。display += "_"走的是列表的原地增量赋值逻辑:这个增量运算符不会调用普通加法的实现,而是直接触发列表的__iadd__方法,也就是原地扩展逻辑,这个方法不要求传入参数必须是列表,只要是可迭代对象就能处理。字符串本身就是可迭代对象,迭代时会逐个取出内部的字符,所以这行代码实际等价于执行display.extend("_"),会把单个"_"追加到列表末尾,自然可以正常运行。
用+=的写法确实能生成和单词长度匹配的下划线列表,刚好满足Hangman游戏的空位展示需求,但这个写法利用了字符串可迭代的隐式特性,代码可读性一般,后续维护的人很容易疑惑为什么列表可以和字符串做加法。
更符合语义的空位初始化写法推荐直接用列表推导,不需要写循环逐次追加:
display = ["_" for _ in word]如果要保留循环写法,更建议显式调用追加方法,逻辑更直白,不会产生歧义:
display = [] for _ in word: display.append("_")
内容的提问来源于stack exchange,提问作者Sarthak
相关产品推荐
相关产品推荐

