Chinaunix首页 | 论坛 | 博客
  • 博客访问: 248203
  • 博文数量: 44
  • 博客积分: 1052
  • 博客等级: 少尉
  • 技术积分: 742
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 16:51
文章分类

全部博文(44)

文章存档

2013年(7)

2012年(14)

2011年(23)

分类: Python/Ruby

2011-08-03 21:56:00

元组为容器存储,不可变类型,顺序访问
元组中的元素可以为任意对象

元组很多操作与列表类似,除下面两点外:
i)元组用(),列表用[]
ii)元组为不可变类型,列表为可变类型。
尤其是第ii)条,

另外创建的元组中只有一个元素的时候,要用逗号,如(2,)
  1. >>> a = (2)
  2. >>> type(a)
  3. <type 'int'>
  4. >>> a = (2,)
  5. >>> type(a)
  6. <type 'tuple'>
  7. >>> b = ()
  8. >>> type(b)
  9. <type 'tuple'>
虽然元组为不可变的,但元组的元素可以是可变的。

所有的多对象的,逗号分隔的,没有明确用符号定义的,这些集合默认的类型都是元组。
看下面的例子
  1. >>> x, y = 1, 2
  2. >>> x, y
  3. (1, 2)
  4. >>> 'a', 3, ['m', 'l']
  5. ('a', 3, ['m', 'l'])            # 结果是元组
  6. >>> def foo():
  7. ... a = 1
  8. ... b = 2
  9. ... c = 3
  10. ... return a, b, c              # 函数一次返回三个结果,其实返回的是一个元组
  11. ...
  12. >>> foo()
  13. (1, 2, 3)
  14. >>> 4, 2 < 3, 5                 # <操作符的优先级要高于逗号操作符,因此这还是一个元组
  15. (4, True, 5)

拷贝python对象,深拷贝和浅拷贝
python中,对象赋值实际上是简单的对象的引用
  1. >>> a = [1, 2, 3]
  2. >>> b = a                 # 从下面可知这里拷贝的是a的引用, 而不是列表对象[1,2,3]
  3. >>> b
  4. [1, 2, 3]
  5. >>> a[0] = 'a'
  6. >>> b
  7. ['a', 2, 3]
浅拷贝  (书中一例)
  1. >>> person = ['name', ['savings', 100.0]]
  2. >>> hubby = person[:]                        # 浅拷贝方式1:[:]切片方式
  3. >>> wifey = list(person)                     # 浅拷贝方式2:工厂函数,如list(),dict()
  4. >>> id(person), id(hubby), id(wifey)
  5. (3078605100L, 3078605580L, 3078605900L)      # 可以看到这三个对象是三个不同的对象
  6. >>> hubby[0] = 'joe'
  7. >>> wifey[0] = 'jane'
  8. >>> hubby
  9. ['joe', ['savings', 100.0]]                  # 修改了hubby[0]
  10. >>> wifey                                    # 修改了wifey[0]
  11. ['jane', ['savings', 100.0]]
  12. >>> person[1][1] = 50                        # 修改了person[1][1]
  13. >>> hubby
  14. ['joe', ['savings', 50]]                     # hubby的hubby[1][1]也改变了
  15. >>> wifey
  16. ['jane', ['savings', 50]]                    # wifey的wifey[1][1]也改变了
  17. >>> person
  18. ['name', ['savings', 50]]                    # 注意person的person[0]没有改变
明显这里对person中的列表元素的拷贝,其实只拷贝了引用。再看下面的一个小例子
  1. >>> a = [(1, [2, 3]), [4, 5]]
  2. >>> b = a[:]
  3. >>> id(b)
  4. 3078517772L
  5. >>> id(a)
  6. 3075988236L
  7. >>> a[0][1][0] = 'a'
  8. >>> a
  9. [(1, ['a', 3]), [4, 5]]
  10. >>> b
  11. [(1, ['a', 3]), [4, 5]]                # 对元组里的列表的拷贝,依旧是浅拷贝,但对元组的拷贝并不是只拷贝引用
浅拷贝还有第三种方式,就是用copy模块中的copy函数拷贝。

如果要进行深拷贝,就要使用copy模块中的deepcopy函数

有关拷贝:
 i)非容器类型没有被拷贝一说
ii)元组中值包含原子类型对象,则对它的深拷贝也不会进行。
阅读(1265) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~