Chinaunix首页 | 论坛 | 博客
  • 博客访问: 439798
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1101
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-04 22:28
个人简介

Never stop learning.

文章分类

全部博文(26)

文章存档

2014年(2)

2013年(24)

分类: Python/Ruby

2013-09-11 08:28:53

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)对象,并试着去
改变它,看会发生什么?
  1. >>> str_1 = 'abc'
  2. >>> type(str_1)
  3. <type 'str'>
  4. >>> str_1[0]
  5. 'a'
  6. >>> str_1[0] = 'f'
  7. Traceback (most recent call last):
  8.   File "", line 1, in <module>
  9. TypeError: 'str' object does not support item assignment
很明显,出现了TypeError,并提示,字符串(strings)对象不支持改变元素。
下面我们再来创建一个列表(lists),并试着改变这个列表,看又会发生什么?
  1. >>> list_1 = [1, 2, 3]
  2. >>> list_1
  3. [1, 2, 3]
  4. >>> id(list_1)
  5. 39892552L
  6. >>> list_1[0] = 9
  7. >>> list_1
  8. [9, 2, 3]
  9. >>> id(list_1)
  10. 39892552L
  11. >>> list_1.append(10)
  12. >>> list_1
  13. [9, 2, 3, 10]
  14. >>> id(list_1)
  15. 39892552L
我们可以看到,list_1的值由[1, 2, 3]变到[9, 2, 3],这个列表(lists)对象的标示(identity)没有变,而再由[9, 2, 3]
变到[9, 2, 3, 10]时,它的标示(identity)仍然没有变。所以,列表对象是可变的。
我们理解了对象的mutability,下面我们来看一个非常经典的例子。
第一组: 这一组,我们在《Python中的对象(二)》中分析过,不再多说。
  1. >>> a = 'foo'
  2. >>> b = a
  3. >>> a, b
  4. ('foo', 'foo')
  5. >>> a = 'xyz'
  6. >>> a, b
  7. ('xyz', 'foo')
第二组: 这一组,无论我们改变LIST1或者LIST2的值,另外一个都会跟着改变。
  1. >>> LIST1 = ['a', 'b', 'c']
  2. >>> LIST2 = LIST1
  3. >>> id(LIST1), id(LIST2)
  4. (39433800L, 39433800L)
  5. >>> LIST1
  6. ['a', 'b', 'c']
  7. >>> LIST2
  8. ['a', 'b', 'c']
  9. >>> LIST2[0] = 123
  10. >>> LIST1
  11. [123, 'b', 'c']
  12. >>> LIST2
  13. [123, 'b', 'c']
  14. >>> id(LIST1), id(LIST2)
  15. (39433800L, 39433800L)
  16. >>> LIST1.append(100)
  17. >>> LIST1
  18. [123, 'b', 'c', 100]
  19. >>> LIST2
  20. [123, 'b', 'c', 100]
  21. >>> id(LIST1), id(LIST2)
  22. (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

阅读(7245) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~