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

posted on 2018-01-31 15:52  Imindy  阅读(64)  评论(0)    收藏  举报

导航