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

Python变量赋值引用的数值变化差异及防误改最佳实践咨询

核心底层逻辑

Python 中所有变量存储的都是对象的内存引用,而非对象本身,两个示例的差异本质是「修改变量存储的引用地址」和「修改引用指向的对象本身」的区别:


场景1:修改变量引用,字典值不变

mylist = ['a', 'b', 'c']
mydict = {}
mydict['list'] = mylist
mylist = ['a']

执行逻辑:

  1. 第一步在内存中创建列表对象['a', 'b', 'c'],将该对象的内存地址存到变量mylist中
  2. mydict['list'] = mylist是把同一个列表的内存地址复制存到字典的对应键值对中,此时mylist和mydict['list']指向内存中同一个列表对象
  3. 最后一步mylist = ['a']是新创建了一个列表对象['a'],将新对象的内存地址覆盖写入变量mylist,这一步仅修改了mylist本身存储的引用,完全没有改动原列表对象,也没有修改字典中存储的引用,因此字典内部的列表值不会变化。

场景2:修改对象本身,字典值同步变化

mylist = ['a', 'b', 'c']
mydict = {}
mydict['list'] = mylist
mylist.append('d')

执行逻辑:
前3步和场景1完全一致,mylist和mydict['list']指向同一个列表对象。最后一步mylist.append('d')没有修改mylist存储的引用,而是顺着引用找到内存中的列表对象,直接修改了该对象的内部内容。因为两个变量指向同一个对象,所以通过字典访问时自然会看到修改后的结果。

注:只有可变对象(列表、字典、集合等)支持修改对象本身的操作,不可变对象(整数、字符串、元组等)的所有修改操作都会生成新对象,不会出现关联修改的情况。


避免意外修改的最佳实践
  • 赋值给其他对象时优先做拷贝:无嵌套的一维容器(一维列表、普通字典)可以用浅拷贝,比如列表调用copy()方法或切片mylist[:],字典调用copy()方法;如果存在嵌套结构,使用copy模块的deepcopy方法生成完全独立的新对象:from copy import deepcopy; new_obj = deepcopy(old_obj),拷贝后两个对象指向完全独立的内存地址,后续修改互不影响。
  • 不需要修改的序列优先使用不可变对象:比如用元组代替列表,用frozenset代替普通集合,从根源上避免对象被意外修改。
  • 函数逻辑默认不修改入参:如果函数内部需要修改传入的可变参数,优先对入参做拷贝后再处理,确实需要直接修改入参的场景要在函数注释中明确说明,避免隐式修改带来的bug。
  • 变量重赋值前排查关联引用:如果一个变量已经被赋值给其他容器/对象,给该变量重赋新值前要确认是否需要同步更新关联的引用,避免逻辑混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:02