Python的可变类型与不可变类型
Python的每个对象都分为可变和不可变,主要的核心类型中,数字、字符串、元组是不可变的,列表、字典是可变的。
对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收)。
不可变类型:
数值不变,内存地址不变; 数值改变,内存地址改变;
eg1:
1 >>> i = 5 2 >>> i += 1 3 >>> i 4 6 5 >>> id(i) 6 140243713967984 7 >>> i += 1 8 >>> i 9 7 10 >>> id(i) 11 140243713967960
eg2:
1 >>> i = 5 2 >>> j = 5 3 >>> id(i) 4 140656970352216 5 >>> id(j) 6 140656970352216 7 >>> k = 5 8 >>> id(k) 9 140656970352216 10 >>> x = 6 11 >>> id(x) 12 140656970352192 13 >>> y = 6 14 >>> id(y) 15 140656970352192 16 >>> z = 6 17 >>> id(z) 18 140656970352192
可变类型:
eg1:
1 >>> a = [1, 2, 3] 2 >>> id(a) 3 4385327224 4 5 >>> b = [1, 2, 3] 6 >>> id(b) 7 4435102392 8 9 >>> a.append(4) 10 >>> id(a) 11 4385327224
从运行结果可以看出,虽然a、b的值相同,但是指向的内存地址不同。我们也可以通过b = a 的赋值语句,让他们指向同个内存地址:
eg2:
1 >>> a = [1, 2, 3] 2 >>> id(a) 3 4435060856 4 >>> b = [1, 2, 3] 5 >>> id(b) 6 4435102392 7 >>> b = a 8 >>> id(b) 9 4435060856
这个时候需要注意,因为a、b指向同个内存地址,而a、b的类型都是List,可变类型,对a、b任意一个List进行修改,都会影响另外一个List的值。
eg3:
1 >>> b.append(4) 2 >>> a 3 [1, 2, 3, 4] 4 >>> b 5 [1, 2, 3, 4] 6 >>> id(a) 7 4435060856 8 >>> id(b) 9 4435060856
代码中,b变量append(4),对a变量也是影响的。输出他们的内存地址,还是指向同个内存地址。
整理自:https://www.cnblogs.com/blackmatrix/p/5614086.html
浙公网安备 33010602011771号