这里可以看到,函数内外 l 变量的地址都是不变的,但因为是可变类型,以是在函数内部修改了变量的值以后,并没有重新分配内存,以是在函数外部 l 变量同步被影响。
那么在函数内部对传入的可变类型变量进行任何操作都会影响到函数外部吗?
不一定,这里提供一个示例:
def test_3(l):
print(f"修改变量前,l 的地址为:{id(l)}")
l = l + [3]
print(f"修改变量后,l 的地址为:{id(l)}")
l = [1, 2]
print(f"调用函数前,l 的地址为:{id(l)}, 值为:{l}")
test_3(l)
print(f"调用函数后,l 的地址为:{id(l)},值为:{l}")
复制代码
它的输出的信息如下:
调用函数前,l 的地址为:2116183414208, 值为:[1, 2]
修改变量前,l 的地址为:2116183414208
修改变量后,l 的地址为:2116200373376
调用函数后,l 的地址为:2116183414208,值为:[1, 2]
复制代码
可以看到,在函数内部,对可变类型进行了操作之后,它的内存地址有所变化,而且修改后不会影响到原始变量。
这是因为在函数内部执行的操作是 l = l + [3],这个操作的本质并不是直接对变量的值进行修改,而是新建一个内存地址,然后对这个变量进行重新赋值,以是这个操作的 l 与函数传入的变量 l 已经不是同一个变量了,因此不会影响到外部的变量。
多说一句,可变类型变量的这个操作其实就跟不可变类型的变量的重新赋值是同一个意义: