把这三块知识点放在一起写,是因为这三点内容都很少。
(写博客可真是件费时费力的活 ,٩(º﹃º٩)
文章目录
元祖(tuple)
元祖和列表很相似,也是任意类型的值的一个序列,并且按照整数下标索引。但是需要注意的是:元祖是不可变数据类型。
语法上,元祖就是一行用逗号分隔开的值
t = 'python', 6324, '人生苦短', ['skr', False]
print(t) # ('python', 6324, '人生苦短', ['skr', False])
但是在写法上约定俗成,需要用括号括起来
t = ('python', 6324, '人生苦短', ['skr', False])
如果元祖中只包含一个元素,那么需要在后面添加一个逗号
t = ('python',)
print(t, type(t)) # ('python',) <class 'tuple'>
t1 = ('python') # 这里的t1并没有转化为tuple,还是字符串本身
print(t1, type(t1)) # python <class 'str'>
也可以用内置函数 tuple() 新建一个空的元祖
t = tuple()
print(t) # ()
在 tuple() 中可以加入参数,将参数的类型转化为元祖,并返回一个元祖。
t1 = tuple('python')
print(t1) # ('p', 'y', 't', 'h', 'o', 'n')
t2 = tuple([6324, 'python', [1, 2, '带带大师兄']])
print(t2) # (6324, 'python', [1, 2, '带带大师兄'])
t3 = tuple(t2)
print(t3) # (6324, 'python', [1, 2, '带带大师兄'])
因为元祖是不可变数据类型,所以在元祖中并没有太多的操作。
len(tuple)
计算元组内元素个数
t = (6324, 'python', [1, 2, '带带大师兄'])
print(len(t)) # 3
del tuple
删除元祖
t = (6324, 'python', [1, 2, '带带大师兄'])
del t
print(t) # 会报错:name 't' is not defined
集合(set)
集合也是一系列值的序列,它是可变数据类型,但集合中的元素必须是不可变数据类型。集合中的元素不重复且无序。
set 的创建及类型转化
set1 = {1, 'python', (6324, '人生苦短')}
print(set1, type(set1)) # {1, (6324, '人生苦短'), 'python'} <class 'set'>
set2 = {}
print(set2, type(set2)) # {} <class 'dict'>
set3 = set(set2)
print(set3, type(set3)) # set() <class 'set'>
增
set.add(elmnt)
给集合中添加元素,若元素已经存在,则不执行任何操作。
set1 = {1, 'python', (6324, '人生苦短')}
set1.add('life')
print(set1) # {1, (6324, '人生苦短'), 'life', 'python'}
set.update(set1)
将set1中的元素更新到set中去,set1 可以是集合和元素。如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。
set1 = {1, 'python', (6324, '人生苦短')}
set1.update('life')
print(set1) # {'l', 1, (6324, '人生苦短'), 'python', 'f', 'e', 'i'}
set2 = {1, 'python', (6324, '人生苦短')}
set2.update({'life', 1, (1, 3)})
print(set2) # {1, (6324, '人生苦短'), (1, 3), 'life', 'python'}
删
set.pop()
随机移除集合中的一个元素
set1 = {1, 'python', (6324, '人生苦短')}
set1.pop()
print(set1)
set.remove(item)
在集合中删除指定元素,但指定元素不存在时会发生错误。
set1 = {1, 'python', (6324, '人生苦短')}
set1.remove('python')
print(set1) # {1, (6324, '人生苦短')}
set1.remove('life') # 此处会报错
set.discard(value)
在集合中删除一个指定的值,这个值可以不存在于集合中
set1 = {1, 'python', (6324, '人生苦短')}
set1.discard('python')
print(set1) # {1, (6324, '人生苦短')}
set1.discard('life')
print(set1) # {1, (6324, '人生苦短')}
set.clear()
清空集合中的所有元素
set1 = {1, 'python', (6324, '人生苦短')}
set1.clear()
print(set1) # set()
del
删除集合
set1 = {1, 'python', (6324, '人生苦短')}
del set1
改
因为集合内部元素是不可变数据类型,所以集合没有改操作。
查
x in set
若 x 在 set 中,返回 True
set1 = {1, 'python', (6324, '人生苦短')}
flag = 'python' in set1
print(flag) # True
其他操作
交集(& 或者 intersection)
set1 = {1, 3, 5, 2, 8}
set2 = {2, 4, 1, 7, 9}
print(set1 & set2) # {1, 2}
print(set1.intersection(set2)) # {1, 2}
并集(| 或者 union)
set1 = {1, 3, 5, 2, 8}
set2 = {2, 4, 1, 7, 9}
print(set1 | set2) # {1, 2, 3, 4, 5, 7, 8, 9}
print(set1.union(set2)) # {1, 2, 3, 4, 5, 7, 8, 9}
差积(- 或者 difference)
set1 = {1, 3, 5, 2, 8}
set2 = {2, 4, 1, 7, 9}
print(set1 - set2) # {8, 3, 5}
print(set1.difference(set2)) # {8, 3, 5}
反交集(^ 或者 symmetric_difference)
set1 = {1, 3, 5, 2, 8}
set2 = {2, 4, 1, 7, 9}
print(set1 ^ set2) # {3, 4, 5, 7, 8, 9}
print(set1.symmetric_difference(set2)) # {3, 4, 5, 7, 8, 9}
子集(< 或者 issubset)
set1 = {1, 3, 5}
set2 = {1, 3, 5, 2, 8}
print(set1 < set2) # True
print(set1.issubset(set2)) # True
超集(> 或者 issuperset)
set1 = {1, 3, 5, 2, 8}
set2 = {1, 3, 5}
print(set1 > set2) # True
print(set1.issuperset(set2)) # True
frozenset()
返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
set1 = frozenset('python')
print(set1, type(set1))
# frozenset({'p', 'n', 'o', 'y', 'h', 't'}) <class 'frozenset'>
深浅copy
在赋值运算中,将 A 的值赋值给 B ,实际上 A 与 B 是指向同一个内存空间的。
l1 = [4396, 6324, ['python', 'life']]
l2 = l1
l1[0] = 2700
print(l1) # [2700, 6324, ['python', 'life']]
print(l2) # [2700, 6324, ['python', 'life']]
l1[2][1] = 'user'
print(l1) # [2700, 6324, ['python', 'user']]
print(l2) # [2700, 6324, ['python', 'user']]
print(id(l1)) # 2828857390600
print(id(l2)) # 2828857390600
浅copy
l1 = [4396, 6324, ['python', 'life']]
l2 = l1.copy()
print(id(l1)) # 1958647117320
print(id(l2)) # 1958647969864
print(id(l1[0])) # 1958646961232
print(id(l2[0])) # 1958646961232
print(id(l1[2][0])) # 1958647087824
print(id(l2[2][0])) # 1958647087824
在 浅copy 中只是在内存中开辟了一块新空间储存新列表。但是新列表和原列表中的元素还是公用的,储存在统一地址内。
深copy
import copy
l1 = [4396, 6324, ['python', 'life']]
l2 = copy.deepcopy(l1)
print(id(l1)) # 1826240527624
print(id(l2)) # 1826240631368
print(id(l1[0])) # 1826208928848
print(id(l2[0])) # 1826208928848
print(id(l1[2][0])) # 1826209055440
print(id(l2[2][0])) # 1826209055440
print(id(l1[-1])) # 1826240527432
print(id(l2[-1])) # 1826240631304
在深copy中,新列表的内存空间是新建的,列表中的可变数据类型的空间也是新建的,但是不可变数据类型依然是公用的。
补充:小数据池,代码块
Python 在内存机制上有两个需要了解的地方:小数据池,代码块。
点击阅读相关博文