2015/9/2 Python基础(7):元组

为什么要创造一个和列表差别不大的容器类型?
元组和列表看起来不同的一点是元组用圆括号而列表用方括号。而最重要的是,元组是不可变类型。这就保证了元组的安全性。
创造元组给它赋值和列表完全一样。除了一个元素的元组要在元组分割符里加一个逗号以防跟普通的分组操作符混淆。

>>> aTuple = (1)
>>> aTuple
1
>>> aTuple = (1,)
>>> aTuple
(1,)

访问元组的值和列表也一样。
更新元组和更新字符串一样,要再构造一个新字符串,删除一个单独的元组元素以不可能的。只能显式地删除一整个元组,当然我们并不需要这么做。

元组和列表一样也没有自己专用的运算符和内建函数。因为元组本身是不可变的,所以这些操作对元组来说就是多余的,没有什么意义。

元组的特殊特性

元组的不可变导致我们不能改变其中的一个或多个元素,这样在我们传递数据给一个不了解的API时,可以保证我们的数据不会被修改。
而当我们需要操作从一个函数返回的元组时,可以用list()函数把它转换成一个列表。
元组的不可变也不是那么的不可变,我们可以像操作字符串一样连接、重复等等操作。还有是,虽然元组对象本身是不可变的,但是不代表它包含的可变对象是不可变的,比如说元组里存在数组:

>>> t = ([‘xyz‘, 123], 23, -103.4)
>>> t
([‘xyz‘, 123], 23, -103.4)
>>> t[0][1]
123
>>> t[0][1] = [‘abc‘, ‘def‘]
>>> t
([‘xyz‘, [‘abc‘, ‘def‘]], 23, -103.4)

所有的多对象的,逗号分隔的,没有明确用符号定义的等等这些集合的默认类型都是元组。

>>> ‘abc‘, -4.24e93, 18+6.6j, ‘xyz‘
(‘abc‘, -4.24e+093, (18+6.6j), ‘xyz‘)
>>>
>>> x, y = 1, 2
>>> x, y
(1, 2)

同样的,所有函数返回的多对象,不包括有符号封装的,都是元组。

作为字典的关键字
不可变对象的值不可变,意味着通过hash算法得到的值总是一个值。这是作为字典键值的必要条件。

拷贝Python对象
浅拷贝和深拷贝
浅拷贝的意思是创建一个和原对象一样的对象类型,其内容是原对象的引用。如下:

>>> person = [‘name‘, [‘savings‘, 100.0]]
>>> hubby = person[:]
>>> origin = [‘abc‘,[‘def‘,12.3]]
>>> copy1 = origin[:]
>>> copy2 = list(origin)
>>> [id(x) for x in origin, copy1, copy2]
[47106648, 47107008, 47104328]
>>> [id(x) for x in origin[0], copy1[0], copy2[0]]
[4172448, 4172448, 4172448]

而因为我们是在浅拷贝,改变其中一份拷贝并不会影响另一份

>>> copy1[0] = ‘change‘
>>> copy1
[‘change‘, [‘def‘, 12.3]]
>>> copy2
[‘abc‘, [‘def‘, 12.3]]

与之相对的就是深拷贝:

>>> origin = [‘abc‘,[‘def‘,12.3]]
>>> copy1 = origin
>>> copy2 = origin
>>> copy1[0] = ‘change‘
>>> copy1
[‘change‘, [‘def‘, 12.3]]
>>> copy2
[‘change‘, [‘def‘, 12.3]]

深拷贝的id指向了同样的量

>>> [id(x) for x in origin, copy1, copy2]
[47106648, 47106648, 47106648]

深浅拷贝还可以通过copy模块里的函数实现,copy.copy()是浅拷贝,copy.deepcopy()是深拷贝。

时间: 2024-10-02 04:55:32

2015/9/2 Python基础(7):元组的相关文章

python基础深入(元组、字符串、列表、字典)

python基础深入(元组.字符串.列表.字典) 一.列表 1.追加 1 >>>list = [1,2,3,4] #用于在列表末尾添加新的对象,只能单个添加,该方法无返回值,但是会修改原来的列表. 2 >>>list.append(5) 3 >>>print(list) 4 [1, 2, 3, 4, 5] 2.统计 1 >>>list = [1,"a","b","c",1,4

2015/9/22 Python基础(18):组合、派生和继承

一个类被定义后,目标就是把它当成一个模块来使用,并把这些对象嵌入到你的代码中去,同其他数据类型及逻辑执行流混合使用.有两种方法可以在你的代码中利用类.第一种是组合,就是让不同的类混合并加入到其他类中,来增强功能和代码重用性.你可以在一个大点的类中创建你自己的类的实例,实现一些其他属性和方法来增强原来的类对象.另一种是派生,通过子类从基类继承核心属性,不断地派生扩展功能实现. 组合举例来说,我们想对之前做过的地址本类作加强性设计.如果在设计的过程中,为names.addresses等创建了单独的类

2015/9/17 Python基础(13):函数

函数是对程序逻辑进行结构化或过程化的一种编程方法. Python的函数返回值当什么也不返回时,返回了None和大多数语言一样,Python返回一个值或对象.只是在返回容器对象时,看起来像返回多个对象.这样在操作的时候显得很灵活,虽然它本质上只是反悔了一个对象. 调用函数我们用一对圆括号电泳函数.任何输入的参数都应该放在括号中. 关键字参数这个概念是针对函数调用的,比如我们有这样的函数 def fun(value, count): fun_suite 我们可以标准调用: fun(12,20) 也可

2015/9/9 Python基础(10):文件和输入输出

文件对象文件对象不仅可以用来访问普通的磁盘文件,而且也可以访问其它任何类型抽象层面上的“文件”.一旦设置了合适的“钩子”,你就可以访问文件类型接口的其它对象,就好像访问的是普通文件一样.文件对象的处理要以来很多内建函数,还有很多函数会返回文件对象或者是类文件对象.进行这种轴向处理的主要原因是许多输入/输出数据结构更趋向于使用通用的接口.这样就可以在程序行为和实现上保持一致性.文件只是连续的字节序列,数据传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成. 文件内建函数[open()和f

2015/8/29 Python基础(3):数值

数字提供了标量储存和直接访问,是不可更改类型,每次变更数值会产生新的对象.Python支持多种数字类型,包括整型.长整型.布尔型.双精度浮点.十进制浮点和复数.在Python中,变量并不是一个盒子,而是一个指针指向装变量值的盒子.对于不可更改类型来说,没办法改变盒子的内容,但是可以指向一个新的盒子.我们没办法删除一个数值对象,仅可以不再使用它.内存管理是由Python自己接管的.可以使用del语句来删除引用,但那样的话,这个引用(也就是变量)就不能使用了,除非给它一个新值 >>> ani

python基础:元组、字典、深浅拷贝与函数

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 一. 元组(tuple) 1. 元组的特点 元组是固定的,不能修改也不能增减.因为元组不可变,所以更安全,如果可以,尽量不使用list而使用tuple 2.  格式 3.  可用参数 4.  元组的结构(以元组a为例) 当创建一个元组a时,将在内存中开辟一个名为a的内存,然后每个索引位置为一个命名空间,每个命名空间都有一个存储,而真实的数据就存在

2015/8/30 Python基础(4):序列操作符

序列是指成员有序排列,可以通过下标偏移量访问的类型.Python序列包括:字符串.列表和元组.序列的每个元素可以指定一个偏移量得到,多个元素是通过切片操作得到的.下标偏移量从0开始计数到总数-1结束. 序列类型操作符这些操作符是对所有序列类型都适用的. 序列操作符  作用 seq[ind]  获得下标为ind的元素 seq[ind1:ind2]  获得下标从ind1到ind2的元素集合 seq * expr  序列重复expr次 seq1 + seq2  连接序列seq1和seq2 obj in

2.python基础深入(元组、字符串、列表、字典)

一,对象与类 对象: python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,玩的手机就是对象. 我们通过描述属性(特征)和行为来描述一个对象的. 在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) 比如人类,动物,植物等等,这些都是类的概念. 类是对象的模板或蓝图,类是对象的抽象化,对象是类的实例化.类不代表具体的事物,而对

2015/9/29 Python基础(20):类的授权

类的授权 1.包装包装在Python编程世界中时经常会被提到的一个术语.它是一个通用的名字,意思是对一个已存在的对象进行包装,不管它是数据类型,还是一段代码,可以是对一个已存在的对象,增加新的,删除不要的,或者修改其他已存在的功能.在Python2.2以前,从Python的标准类型子类化或派生类都是不允许的,即使你现在可以这么做,这种做法也并不多.你可以包装任何类型作为一个类的核心成员,以使新对象的行为模仿你想要的数据类型中已存在的行为,并且去掉你不希望存在的行为:它可能会要做一些额外的事情.这