You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中指向同一内存的两个变量,修改其一为何另一个不变?

问题核心原因:Python的变量是对象引用,「重新赋值变量」和「原地修改对象」是完全不同的操作

基础原理

Python中的变量本质是绑定到内存对象上的标签,不是对象本身:

  • 如果你执行l1.append(1)、l1[0] = 3这类操作,属于原地修改对象:直接修改l1这个标签当前指向的内存对象的内容,所有指向该对象的其他引用(比如lines[-1])都会同步看到修改,因为大家指向的是同一个内存对象。
  • 如果你执行l1 = []、l1 = [32,32]这类操作,属于重新绑定变量:会先创建一个新的内存对象,然后把l1这个标签从原来指向的旧对象上撕下来,绑定到新对象上,这个操作完全不会修改旧对象的内容,也不会影响其他绑定到旧对象的引用。

结合你的代码逐行解释

你代码里的执行逻辑是这样的:

  1. l1 =[s1,s2]:创建一个内容为[s1,s2]的列表对象,把l1标签绑定到这个对象上。
  2. lines.append(l1):把lines列表的最后一个元素也绑定到刚才创建的[s1,s2]对象上,此时l1和lines[-1]两个标签绑在同一个对象上,所以l1 is lines[-1]返回True。
  3. l1=[]:新创建一个空列表对象,把l1标签从原来的[s1,s2]对象上解绑,重新绑定到这个新的空列表上。这一步完全没有修改原来的[s1,s2]对象,lines[-1]仍然绑定在旧对象上,所以此时l1和lines[-1]已经指向完全不同的两个对象,自然返回False。

你的猜测完全正确

两种操作的本质差异就是你观察到的:

  • 原地修改对象(比如append、修改列表元素)会影响所有指向该对象的引用
  • 给变量重新赋值只是修改变量本身的绑定指向,和原来绑定的对象没有关系,也不会影响其他引用

内容的提问来源于stack exchange,提问作者Max K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:24:01