Python中引用传递与(不)可变对象

Python中只有引用传递

在Python中,万物皆对象。Python中不存在所谓的值传递,一切传递的都是对象的引用,也可以认为是传址。

举例来说,

1
2
3
4
a = 1 #将名字a与内存中值为1的内存绑定在一起
a = 2 #将名字a与内存中值为2的内存绑定在一起,而不是修改原来a绑定的内存中的值,这时,内存中值为1的内存地址引用计数-1,当引用计数为0时,内存地址被回收
b = a #变量b执行与a绑定的内存
b = 3 #创建一个内存值为3的内存地址与变量名字b进行绑定。这时a还是指向值为2的内存地址

Python中可变对象与不可变对象

在Python中,对象分为可变(mutable)和不可变(immutable)两种类型,元组(tuple)、数值型(number)、字符串(string)均为不可变对象,而字典型(dictionary)、列表型(list)、集合(set)的对象是可变对象。

1
2
3
a = [12, 34, 56]
a.append(78) #这里是修改了变量a所指向的list对象内部状态
a = [11, 22, 33] #这里是修改了变量a的引用,并没有修改[12, 34, 56]对象的内部状态哦

闲杂

在Python中a = b是一次对象的引用传递,也就是此时a和b其实指向的是同一块内存地址(不管a,b是可变对象,还是不可变对象)。若a,b是可变对象的话,那么修改对象的值,例如增加一个元素,这是a和b所引用的对象都会变化。而不管a,b是不是可变对象,执行完a = b后,然后对其中的一个变量进行了重新绑定(和修改对象的内容不一样哦),也就是说修改了变量的引用,那a和b的引用就不同了哦。

备注:感觉其实Java中的参数传递和Python是一样的,待验证。