python中的集合,is和==的区别、深拷贝和浅拷贝、公共方法

集合

可变集合 :    set 集合里面的内容可以被改变

不可变集合 : frozenset 集合里面的内容不可以被改变

集合最大的功能 :去重

test = 'hello' 
a = set(test) 
print(a)              # {'e', 'l', 'o', 'h'}

1、clear 清空

test = 'hello'
a = set(test)
a.clear()
print(a)            # set()

2、pop随机删除一个元素、discard():# 删除指定数据,如果数据不存在不报错

test = 'hello'
a = set(test)
a.pop()              # 随机删除一个元素
print(a)

s1 = {10, 20, 30, 40, 50}
# discard():# 删除指定数据,如果数据不存在不报错
s1.discard(10)
print(s1)

s1.discard(100)
print(s1)

3、remove 随机移除一个元素

test = 'hello'
a = set(test)
a.remove('l')
print(a)

4、copy拷贝

test = 'hello'
a = set(test)
b = a.copy()          # 拷贝赋值给到b这个变量
print(b)

5、add 随机位置,添加一个元素、update(): 增加的数据是序列

test = 'hello'
a = set(test)
a.add('666')          # add就是添加一个元素
print(a)
print(type(a))        # 数据类型是集合:<class 'set'>


# update(): 增加的数据是序列
s1 = {10, 20}
s1.update([10, 20, 30, 40, 50])
print(s1)       # {40, 10, 50, 20, 30}


# s1.update(100)  # 报错
# print(s1)

6、不可变集合 元素不能改表

test = 'hello'
a = frozenset(test)     # 不可变集合  元素不能改表
b = a.copy()
print(b)
print(a)
print(type(a))         # <class 'frozenset'>
​
不能进行任何操作
a.clear()            # 'frozenset' object has no attribute 'clear'
print(a)             # “frozenset”对象没有属性“clear”

7、集合作用:对列表进行去重

list1 = [1,1,1,22,8,999]
list2 = set(list1)
print(list2)          # {8, 1, 22, 999}
print(type(list2))
for i in list2:
    print(i)

8、in 或not in 判断

s1 = {10, 20, 30, 40, 50}

# in 或not in 判断数据10是否存在
print(10 in s1)

print(10 not in s1)

is和==的区别

        is和==都可以对两个对象进行比较,而且它们的返回值都是布尔类型,但是它们比较的内容是不同的。

is比较的是两个对象的地址值,也就是说两个对象是否为同一个实例对象;

而==比较的是对象的值是否相等,其调用了对象的__eq__()方法。

list1 = [1, 2, 3]
list2 = [1, 2, 3]


print(list1 == list2)      # True
print(list1 is list2)      # False

可变和不可变数据类型分类:

不可变:Number(数字)、String(字符串)、Tuple(元组)。
可以变:List(列表)、Dictionary(字典)、Set(集合)。

深拷贝和浅拷贝 

  • 浅拷贝,指的是重新分配一块内存创建一个新的对象,但里面的元素是原对象中各个子对象的引用

改变原始对象中为可变类型的元素的值,会同时影响拷贝对象。
改变原始对象中为不可变类型的元素的值,不会响拷贝对象。

import copy

# 定义一个列表,其中第一个元素是可变类型。
list1 = [[1, 2], 'DCS', 66]

# 进行浅copy
list2 = copy.copy(list1)

# 对象地址不同。
print(id(list1))       # 2491842851656
print(id(list2))       # 2491842817032

# 第一个元素地址相同
print(id(list1[0]))    # 2491842729416
print(id(list2[0]))    # 2491842729416

# 第二个元素地址相同
print(id(list1[1]))    # 2491839709960
print(id(list2[1]))    # 2491839709960

# 改变第一个值,复制对象也发生变化
list1[0][0] = 2
print(list2)           # [[2, 2], 'DCS', 66]
print(list1)           # [[2, 2], 'DCS', 66]


# 改变第二个值,复制对象没发生变了
list1[1] = 'ge'
print(list2)           # [[2, 2], 'DCS', 66]
print(list1)           # [[2, 2], 'ge', 66]
  • 深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联

深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。
经过深拷贝后,原始对象和拷贝对象所有的可变元素地址都没有相同的了。

import copy

# 定义一个列表,其中第一个元素是可变类型。
list1 = [[1, 2], 'fei', 66]
# 进行深copy
list2 = copy.deepcopy(list1)

# 对象地址是不同的。
print(id(list1))          # 1863611741192
print(id(list2))          # 1863611706568

# 第一个元素地址不同。
print(id(list1[0]))       # 1863611614728
print(id(list2[0]))       # 1863611741128

# 第二个元素地址相同
print(id(list1[1]))       # 1863608599304
print(id(list2[1]))       # 1863608599304

# 改变第一个值,复制对象没发生变了
list1[0][0] = 2
print(list2)              # [[1, 2], 'fei', 66]
print(list1)              # [[2, 2], 'fei', 66]

# 改变第二个值,复制对象没发生变了
list1[1] = 'ge'
print(list2)              # [[1, 2], 'fei', 66]
print(list1)              # [[2, 2], 'ge', 66]

python 公共方法  

str1 = 'aa'
str2 = 'bb'

list1 = [1, 2]
list2 = [10, 20]

t1 = (1, 2)
t2 = (10, 20)

dict1 = {'name': 'Python'}
dict2 = {'age': 30}

# +: 合并
print(str1 + str2)               # aabb
print(list1 + list2)             # [1, 2, 10, 20]
print(t1 + t2)                   # (1, 2, 10, 20)

# print(dict1 + dict2)  # 报错:字典不支持合并运算
str1 = 'a'
list1 = ['hello']
t1 = ('world',)

# *:复制
print(str1 * 5)             # aaaaa

# 打印10个-:
print('-' * 10)             # ----------

print(list1 * 5)            # ['hello', 'hello', 'hello', 'hello', 'hello']

print(t1 * 5)               # ('world', 'world', 'world', 'world', 'world')
str1 = 'abcd'
list1 = [10, 20, 30, 40]
t1 = (100, 200, 300, 400)
dict1 = {'name': 'Python', 'age': 30}

# in 和 not in
# 1. 字符a是否存在
print('a' in str1)
print('a' not in str1)

# 2. 数据10是否存在
print(10 in list1)
print(10 not in list1)

# 3. 100是否存在
print(100 not in t1)
print(100 in t1)

# 4. name是否存在
print('name' in dict1)
print('name' not in dict1)
print('name' in dict1.keys())
print('name' in dict1.values())


len 函数

str1 = 'abcdefg'
list1 = [10, 20, 30, 40, 50]
t1 = (10, 20, 30, 40, 50)
s1 = {10, 20, 30, 40, 50}
dict1 = {'name': 'TOM', 'age': 18}

print(len(str1))
print(len(list1))
print(len(t1))
print(len(s1))
print(len(dict1))

del 函数

str1 = 'abcdefg'
list1 = [10, 20, 30, 40, 50]
t1 = (10, 20, 30, 40, 50)
s1 = {10, 20, 30, 40, 50}
dict1 = {'name': 'TOM', 'age': 18}

# del 目标 或del(目标)
del str1
print(str1)

del(list1)
print(list1)
del(list1[0])
print(list1)

del s1
print(s1)

del dict1
print(dict1)
del dict1['name']
print(dict1)

max 和 min 函数

str1 = 'abcdefg'
list1 = [10, 20, 30, 40, 50]

# max() : 最大值
print(max(str1))
print(max(list1))

# min() : 最小值
print(min(str1))
print(min(list1))

enumerate 返回结果是元组,元组第一个数据是原迭代对象的数据对应的下标,元组第二个数据是原迭代对象的数据

list1 = ['a', 'b', 'c', 'd', 'e']

# enumerate 返回结果是元组,元组第一个数据是原迭代对象的数据对应的下标,元组第二个数据是原迭代对象的数据
for i in enumerate(list1):
    print(i)

for i in enumerate(list1, start=1):
    print(i)

数据转换

list1 = [10, 20, 30, 20, 40, 50]
s1 = {100, 300, 200, 500}
t1 = ('a', 'b', 'c', 'd', 'e')

# tuple(): 转换成元组
print(tuple(list1))       # (10, 20, 30, 20, 40, 50)
print(tuple(s1))          # (200, 100, 500, 300)

# list():转换成列表
print(list(s1))          # [200, 100, 500, 300]
print(list(t1))          # ['a', 'b', 'c', 'd', 'e']

# set():转换成集合
print(set(list1))        # {40, 10, 50, 20, 30}
print(set(t1))           # {'e', 'a', 'b', 'd', 'c'}    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值