Python中+=运算符与n=n+v为何执行结果存在差异?
为什么Python中
n += v和n = n + v对列表的表现不同? 之前我认为n = n + v与n += v功能等价,但实际测试发现结果不同:
使用+=的代码示例
def assign_value(n, v): n += v print(n) l1 = [1, 2, 3] l2 = [4, 5, 6] assign_value(l1, l2) print(l1)
输出:
[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6]
使用n = n + v的代码示例
def assign_value(n, v): n = n + v print(n) l1 = [1, 2, 3] l2 = [4, 5, 6] assign_value(l1, l2) print(l1)
输出:
[1, 2, 3, 4, 5, 6] [1, 2, 3]
差异原因
两者的核心区别在于是否修改原对象:
+=是增量赋值运算符,对于列表这类可变对象,它会调用对象的__iadd__方法,直接在原内存地址上修改对象内容。函数中的参数n和外部的l1指向同一个列表对象,所以函数内的修改会同步反映到外部的l1上。n = n + v会先执行n + v,这个操作会创建一个全新的列表对象,然后把函数内的局部变量n重新指向这个新对象。此时函数内的n和外部的l1已经是两个不同的对象,所以外部的l1不会被改变。
你可以通过打印id(n)验证这个差异:在+=的函数中,修改前后n的内存地址完全一致;而在n = n + v的函数中,修改后n的地址会变成新对象的地址。
内容的提问来源于stack exchange,提问作者Phoenix IV
相关产品推荐
相关产品推荐

