Python列表赋值操作差异疑问:为何两段相似代码输出结果不同
Python两段列表赋值代码结果差异的核心原理
这两个运行结果的差异,本质来自Python的变量引用语义,以及「可变对象原地修改」和「变量重新赋值」两种操作的本质区别:
第一段代码运行逻辑
list_1 = [1] list_2 = list_1 list_1[0] = 2 print(list_2)
运行步骤:
- 执行
list_1 = [1]:内存中创建列表对象[1],变量list_1存储该对象的内存地址,指向这个列表 - 执行
list_2 = list_1:将list_1存储的内存地址赋值给list_2,此时两个变量指向同一个列表对象 - 执行
list_1[0] = 2:这是原地修改可变对象的操作,没有创建新对象,直接修改了公共列表的第一个元素值 - 最终打印
list_2时,读取的是修改后的列表,输出为[2]
第二段代码运行逻辑
list_1 = [1] list_2 = list_1 list_1 = 2 print(list_2)
运行步骤:
- 前两步和第一段完全一致:
list_1和list_2共同指向列表对象[1] - 执行
list_1 = 2:这是变量重新赋值操作,内存中创建新的整数对象2,让list_1转而指向这个新的整数地址,该操作不会影响原有列表对象,也不会修改list_2的指向 - 最终
list_2仍然指向原来的[1]列表,输出为[1]
核心区别总结
- 对列表、字典这类可变对象执行
变量[索引] = 新值、append()、update()等操作时,修改的是对象本身,所有指向该对象的变量都会同步感知到变化 - 执行
变量 = 新值这类直接赋值操作时,只是改变当前变量的指向,让它关联到新的对象,完全不会影响其他指向旧对象的变量
内容的提问来源于stack exchange,提问作者BertHobe
相关产品推荐
相关产品推荐

