关于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
相关产品推荐
相关产品推荐

