一入python深似海--tuple和set

tuple(元组)

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,tuple属于不可变对象。比如同样是列出同学的名字:

>>> classmates = ('Michael', 'Bob', 'Tracy')

现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0]classmates[-1],但不能赋值成另外的元素。

不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。

只有1个元素的tuple定义时必须加一个逗号,以消除与数学表达式的歧义。

>>> t = (1,)#not (1)
>>> t
(1,)

最后来看一个“可变的”tuple:

<span style="font-size:10px;">>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])</span>

这个tuple定义的时候有3个元素,分别是‘a‘‘b‘和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了?

别急,我们先看看定义的时候tuple包含的3个元素:
                    当我们把list的元素‘A‘‘B‘修改为‘X‘‘Y‘后,tuple变为:

 
                         

表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向‘a‘,就不能改成指向‘b‘,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!

理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。

set(集合)

set可以看成数学意义上的无序和无重复元素的集合。

>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
set([1, 2, 3])

set操作结合:

通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:

>>> s.add(4)
>>> s
set([1, 2, 3, 4])
>>> s.add(4)
>>> s
set([1, 2, 3, 4])

通过remove(key)方法可以删除元素:

>>> s.remove(4)
>>> s
set([1, 2, 3])

两个set可以做数学意义上的交集、并集等操作:

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
set([2, 3])
>>> s1 | s2
set([1, 2, 3, 4])

set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。

一入python深似海--tuple和set

时间: 2024-10-10 15:04:56

一入python深似海--tuple和set的相关文章

一入python深似海--变量和对象

一.基本原理 Python中一切都是对象,变量是对象的引用.这是一个普遍的法则.我们举个例子来说,Python是如何来处理的. x = 'blue' y = 'green' z = x 当python执行上面第一句的时候,会在heap中首先创建一个str对象,其文本内容为blue,同时还创建一个名为x的对象引用,x引用的就是这个str对象.第二句也是类似:第三条创建了一个名为z的新对象引用,并将其设置为对象引用x所指向的相同对象.如下图的变化. 所以看出在Python中赋值操作符号"="

一入python深似海--while-loop与for-loop

while loops 定义与实例 i = 0 numbers = [] while i < 6: print "At the top i is %d" % i numbers.append(i) i = i + 1 print "Numbers now: ", numbers print "At the bottom i is %d" % i print "The numbers: " for num in numbe

一入python深似海--list

几个实例展示python中数据结构list的魅力! list变量申明 the_count = [1, 2, 3, 4, 5] fruits = ['apples', 'oranges', 'pears', 'apricots'] change = [1, 'pennies', 2, 'dimes', 3, 'quarters'] 访问list元素 array= [1,2,5,3,6,8,4] #其实这里的顺序标识是 (0,1,2,3,4,5,6) (-7,-6,-5,-4,-3,-2,-1)#有

一入python深似海--对象的属性

Python中一切皆是对象,每个对象都可以有多个属性.Python是如何管理这些属性呢?我们来探讨一下. 属性的__dict__系统 对象的属性包含两部分:类属性和对象属性.对象的属性可能来自于其类的定义,叫做类属性.类属性可能来自于类的定义自身,也可能来自父类.一个对象的属性还可能是该对象实例定义的,叫做对象属性. 对象的属性存储在对象的__dict__属性中.__dict__为一个字典,键为属性名,对应的值为属性本身.下面是一个例子. class bird(object): feather

一入python深似海--浅拷贝与深拷贝

python中有一个模块copy,deepcopy函数用于深拷贝,copy函数用于浅拷贝.要理解浅拷贝,必须先弄清楚python中的引用. 引用 Python中一切都是对象,变量中存放的是对象的引用.这是一个普遍的法则.可以说 Python 没有赋值,只有引用.如,a=1,变量a只是整数对象1的引用. 可变对象与不可变对象及其引用 一.不可变对象 不可变对象包括:数字,字符串,元组. 由于Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的.

一入python深似海--函数与文件

先上写干货,几个开源网站: github.com launchpad.net gitorious.org sourceforge.net freecode.com 今天介绍一下python函数和文件读写的知识. 函数 def print_two(*args):#That tells Python to take all the arguments to the function and then put them in args as a list arg1,arg2=args print "a

一入python深似海--split

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

一入python深似海--range()与for

range用法 使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节. 这里记录一下: range(1,5)#代表从1到5(不包含5) [1,2,3,4] range(1,5,2)#代表从1到5,间隔2(不包含5) [1,3] range(5)#代表从0到5(不包含5) [0,1,2,3,4] 再看看list的操作: array= [1,2,5,3,6,8,4] #其实这里的顺序标识是 [1,2,5,3,6,8,4] (0,1,2,3,4,5,

一入python深似海--class

python class 分为三个部分:class and object(类与对象),inheritance(继承),overload(重载)and override(覆写). class and object 类的定义,实例化,及成员访问,顺便提一下python中类均继承于一个叫object的类. class Song(object):#definition def __init__(self, lyrics): self.lyrics = lyrics#add attribution def