Python列表赋值拼接结果与浅拷贝预期不符的原因咨询
代码执行逻辑解析:列表赋值与拼接的误区
让我们一步步拆解这段代码的执行过程,帮你理清为什么结果和你的预期有差异:
1. 初始列表创建
list1 = [3,4]
这行代码在内存中创建了一个列表对象 [3,4],变量 list1 会存储这个对象的内存地址,相当于list1“指向”了这个列表。
2. 变量赋值的本质(不是浅/深拷贝!)
list2 = list1
这里你误以为是浅拷贝或深拷贝,但其实这只是引用传递:list2 并没有复制一个新的列表,而是直接拿到了 list1 指向的那个内存地址。现在 list1 和 list2 都指向同一个列表对象 [3,4]——就像两个人共用一把钥匙开同一扇门。
3. 列表拼接的关键:创建新对象
list1 = list1 + [10,11]
Python 中的 + 运算符用于列表拼接时,会创建一个全新的列表对象:它把原list1的内容 [3,4] 和 [10,11] 合并,生成新列表 [3,4,10,11],然后把这个新对象的内存地址重新赋值给 list1。
这时候,list1 已经“换了门”,指向了新的列表;但 list2 仍然握着原来那把钥匙,指向最初的 [3,4]。
4. 打印结果的逻辑
所以执行 print(list1) 会输出新列表 [3, 4, 10, 11],print(list2) 输出的还是最初的 [3, 4]——你之前写反了实际运行结果哦。
补充:如果想让list2跟着变化怎么办?
如果希望修改 list1 时 list2 也同步更新,你需要修改原列表对象而不是创建新对象,比如用 extend() 方法:
list1 = [3,4] list2 = list1 list1.extend([10,11]) # 直接修改原列表,不创建新对象 print(list1) # 输出 [3,4,10,11] print(list2) # 输出 [3,4,10,11]
这时候因为list1和list2指向同一个对象,修改原对象会让两个变量的结果都改变。
内容的提问来源于stack exchange,提问作者Soumen Mondal
相关产品推荐
相关产品推荐

