Python中的对象(三)
By Harrison Feng in Python
我们在前面的两篇文章《
Python中的对象(一)》,《
Python中的对象(二)》中分别分享了对象的基本概念以及Python
中对象的特性。今天,我们要更加深入地了解Python的对象。
我们知道Python的对象根据其可变性(mutability)可以将它们分成可变对象(mutable objects)和不变对象(immutable
objects)。在Python的核心数据类型中,数字(numbers),字符串(strings),布尔(bools)和元组(tuples)是不变对象
(immutable objects);而列表(lists)和字典(dictionaries)是可变对象(mutable objects)。如图1所示
图 1. Mutability
那么我们怎么来理解对象的可变性(mutability)呢?以一个例子说明之。我们创建一个字符串(strings)对象,并试着去
改变它,看会发生什么?
-
>>> str_1 = 'abc'
-
>>> type(str_1)
-
<type 'str'>
-
>>> str_1[0]
-
'a'
-
>>> str_1[0] = 'f'
-
Traceback (most recent call last):
-
File "", line 1, in <module>
-
TypeError: 'str' object does not support item assignment
很明显,出现了TypeError,并提示,字符串(strings)对象不支持改变元素。
下面我们再来创建一个列表(lists),并试着改变这个列表,看又会发生什么?
-
>>> list_1 = [1, 2, 3]
-
>>> list_1
-
[1, 2, 3]
-
>>> id(list_1)
-
39892552L
-
>>> list_1[0] = 9
-
>>> list_1
-
[9, 2, 3]
-
>>> id(list_1)
-
39892552L
-
>>> list_1.append(10)
-
>>> list_1
-
[9, 2, 3, 10]
-
>>> id(list_1)
-
39892552L
我们可以看到,list_1的值由
[1, 2, 3]变到
[9, 2, 3],这个列表(lists)对象的标示(identity)没有变,而再由
[9, 2, 3]
变到
[9, 2, 3, 10]时,它的标示(identity)仍然没有变。所以,列表对象是可变的。
我们理解了对象的mutability,下面我们来看一个非常经典的例子。
第一组: 这一组,我们在《
Python中的对象(二)》中分析过,不再多说。
-
>>> a = 'foo'
-
>>> b = a
-
>>> a, b
-
('foo', 'foo')
-
>>> a = 'xyz'
-
>>> a, b
-
('xyz', 'foo')
第二组: 这一组,无论我们改变LIST1或者LIST2的值,另外一个都会跟着改变。
-
>>> LIST1 = ['a', 'b', 'c']
-
>>> LIST2 = LIST1
-
>>> id(LIST1), id(LIST2)
-
(39433800L, 39433800L)
-
>>> LIST1
-
['a', 'b', 'c']
-
>>> LIST2
-
['a', 'b', 'c']
-
>>> LIST2[0] = 123
-
>>> LIST1
-
[123, 'b', 'c']
-
>>> LIST2
-
[123, 'b', 'c']
-
>>> id(LIST1), id(LIST2)
-
(39433800L, 39433800L)
-
>>> LIST1.append(100)
-
>>> LIST1
-
[123, 'b', 'c', 100]
-
>>> LIST2
-
[123, 'b', 'c', 100]
-
>>> id(LIST1), id(LIST2)
-
(39433800L, 39433800L)
这是为什么呢?看了下面的图,就会恍然大悟的。
1、 创建LIST1
图 2.
LIST1
2、使 LIST2 = LIST1
图 3. LIST2 = LIST1
3、改变LIST2(改变第一个元素)
图 4. 改变LIST2
很显然,LIST1和LIST2是绑定到同一个列表对象,所以,无论这个这列表对象怎么变,LIST1和LIST2都是指向这个列表对象。
因此,上面第二组发生的事情就变的很清晰明白,没有疑问了。
今天我们分享的对象的可变性(mutability)是Python对象一个非常重要的特性。在使用Python的时候,你要深入的理解并应用
这一特性,且避免犯一些低级的错误。
By Harrison Feng in Python
阅读(642) | 评论(0) | 转发(0) |