Python基础之元祖,集合及深浅copy

把这三块知识点放在一起写,是因为这三点内容都很少。
写博客可真是件费时费力的活 ,٩(º﹃º٩)

元祖(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 在内存机制上有两个需要了解的地方:小数据池,代码块。
点击阅读相关博文

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页