zoukankan      html  css  js  c++  java
  • 2.2.1 元组

      元组也是Python的一个重要序列结构。从形式上,元组的所有元素放在一对圆括号中,元素之间使用逗号分隔。下面的代码演示了创建元组的方法:

     1 >>> x = (1,2,3)       #直接把元组赋值给一个变量
     2 >>> x
     3 (1, 2, 3)
     4 >>> 
     5 >>> type(x)           #用type()函数查看变量类型
     6 <class 'tuple'>
     7 >>> 
     8 >>> x = (3)           #这和x = 3 的效果是一样的
     9 >>> x
    10 3
    11 >>> 
    12 >>> x = (3,)          #如果元组中只有一个元素,必须在元素后面多写一个逗号
    13 >>> 
    14 >>> x
    15 (3,)
    16 >>> 
    17 >>> type(x)
    18 <class 'tuple'>
    19 >>> 
    20 >>> x = ()             #空元组
    21 >>> 
    22 >>> type(x)
    23 <class 'tuple'>
    24 >>> 
    25 >>> x = tuple()        #空元祖
    26 >>> 
    27 >>> x
    28 ()
    29 >>> 
    30 >>> tuple(range(5))      #将其他迭代对象转换为元组
    31 (0, 1, 2, 3, 4)
    32 >>> 

      元组属于不可变序列,一旦创建,没有热河方法可以修改元组中元素的值,也无法为元组增加或删除元素。因此,元组没有提供append()、extend()和insert()等方法,无法向元组中添加元素;同样,元组也没有remove()和pop()方法,也不支持对元组元素进行del操作,不能从元组中删除元素,而只能使用del命令删除整个元组,元组也支持切片操作,但是只能通过切片来访问元组中的元素,而不支持使用切片来修改元组中元素的值,也不支持使用切片操作来为元组增加或删除元素。从一定程度上讲,可以认为元组是轻量级的列表,或者“常量列表”。
      Python内部实现对元组做了大量优化,访问和处理速度比列表更快。如果定义了一系列唱两只,主要用途是对它们进行遍历或者其它类似用途,而不需要对其元素进行任何修改,那么一般建议使用元组而不用列表。元组在内部实现上不允许修改其元素值,从而使得代码更加安全,例如,调用函数时使用元组传递参数可以放置在函数中修改元组,而使用列表很难做到这一点。

      另外,作为不可变序列,与整数、字符串一样,元组可用作字典的键,而列表永远都不能作字典的键使用,也不能作为集合中的元素,因为列表不是不可变的,或者说不可哈希。

      虽然元组属于不可变序列,其元素的值是不可改变的,但是如果元组中包含可变序列,情况又变得复杂了。如下:

     1 >>> x = ([1,2],3)                           #元组的第一个元素是列表[1,2] ,在列表部分也讲过,列表中存储的是内存中对象的引用,可以把列表当做存储引用的容器。
     2 >>> 
     3 >>> x[0][0] = 5                             #为元组中的列表增加元素
     4 >>> 
     5 >>> x
     6 ([5, 2], 3)
     7 >>> 
     8 >>> x[0].append(8)
     9 >>> x
    10 ([5, 2, 8], 3)
    11 >>> 
    12 >>> x[0] = x[0] + [10]                      #试图修改元组的值,失败。
    13 Traceback (most recent call last):
    14   File "<pyshell#38>", line 1, in <module>
    15     x[0] = x[0] + [10]
    16 TypeError: 'tuple' object does not support item assignment
    17 >>> 

    #我在思考,为何
    x[0] = x[0] + [10]  这步操作会失败

    是因为 元组x在定义时,有两个元素,第一个元素是一个列表,该列表有两个元素,第二个元素是一个数值。虽然后续可以用append()函数向第一个元素中增加元素,这是因为list是可变的。

    原来是:第一个操作的是原列表 第二个是生成新的列表 ,由于tuple的是不可变序列,所以生成新的列表,元组就不认了。

    验证了一下,

    >>> a = [1,2]
    >>> id(a)
    55784648
    >>>
    >>> a.append(8)
    >>>
    >>> id(a)
    55784648
    >>>
    >>> b = a + [10]
    >>>
    >>> id(b)
    55110600
    >>>

     

    还真是这样啊。

  • 相关阅读:
    梦想就是梦想,不要让它成为杯具
    程序员,离开了库你还能干什么?
    采用WPF框架编写的3D软渲染Demo
    what the hell with Gimbal Lock?
    FX Composer VS RenderMonkey 使用对比之 FX Composer篇
    为什么你应该使用OpenGL而不是DirectX?
    游戏中的夜视效果实现
    {转}深入浅出之正则表达式(一)
    正则表达式30分钟入门教程版本:v2.31 (2009411) 作者:deerchao 转载请注明来源
    2013年
  • 原文地址:https://www.cnblogs.com/avention/p/8543016.html
Copyright © 2011-2022 走看看