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

关于Python Pass-By-Object-Reference中id()结果一致的疑问

Python函数传参中内存地址一致的原因解析

你遇到的问题核心是对「传对象引用」概念的理解偏差,文章里说的“创建新变量”和你理解的“指向新对象”不是一回事:

  • Python的函数传参逻辑是传对象引用:当你把myList传入append函数时,函数内部会创建一个新的局部变量(也就是参数list),但这个变量存储的是和外部myList完全相同的对象引用——简单说就是,两个变量都指向内存里的同一个列表对象,所以用id()获取的内存地址自然一致。
  • 你测试中[0]的id和myList不同,是因为这是一个全新创建的列表对象,和myList指向的不是同一个内存块,地址当然不一样。
  • 而调用list.append(1)时,是通过引用直接修改了对象本身的内容,所以外部的myList也能看到变化——毕竟它们指向的是同一个东西。

如果想验证“创建新变量”这个点,可以试试在函数里给参数重新赋值:

def main():
    myList = [0]
    print(f'myList: {id(myList)}')
    append(myList)
    print(f'After call: {myList}')

def append(list):
    print(f'append\'s list before reassign: {id(list)}')
    list = [0,1,2]  # 重新赋值,让局部变量指向新对象
    print(f'append\'s list after reassign: {id(list)}')

这时候你会看到,重新赋值后函数内部的list地址变了,而且外部的myList不会被修改——因为此时内部变量已经和外部变量指向不同的对象了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:18:33