欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

元组、字典、集合内置方法, 深浅拷贝

程序员文章站 2022-06-07 15:05:33
[TOC] 元组内置方法 作用 元组可以看成只可取不可修改的列表,元组一创建就被写死了 定义方式 ()内用逗号隔开多个元素(可以为任意数据类型) 使用方法 有序or无序 元组能索引取值,是有序的 可变or不可变 算是不可变吧 字典内置方法 作用 存储多个值,对每个数据有描述意义 定义方式 {}内用逗 ......

目录

元组内置方法

作用

元组可以看成只可取不可修改的列表,元组一创建就被写死了

定义方式

()内用逗号隔开多个元素(可以为任意数据类型)

tup = tuple((1, 2, 3))
print(tup, type(tup))

# 如果元组只有一个元素,必须得加逗号
tup1 = (1,)
print(tup1, type(tup1))

使用方法

tup = (1,2,3,4,5,)

# 1.索引取值
print(tup[1])   # 2

# 2.切片
print(tup[1:4])  # (2, 3, 4)

# 3.for循环
for i in tup:
    print(tup)
    
# 4.len长度
print(len(tup))   # 5

# 5.in / not in
print(0 in tup)   # false

# 6.index获取索引
print(tup.index(1))   # 0

# 7.count计数
print(tup.count(1))   # 1

有序or无序

元组能索引取值,是有序的

可变or不可变

算是不可变吧

字典内置方法

作用

存储多个值,对每个数据有描述意义

定义方式

{}内用逗号隔开多个键key(具有描述意义,不能为可变数据类型):值value(任意数据类型)

使用方法

dic = {'a':1, 'b':2}

# 1.按key取值
print(dic['a'])  # 1

# 2.按key修改值
dic['a'] = 666
print(dic)  #  {'a': 666, 'b': 2}

dic['c'] = 3   # 没有就加值
print(dic)   # {'a': 666, 'b': 2, 'c': 3}

# 3.for循环
for i in dic:
    print(i)  # 只能取到key值
    
# 4.in / not in 
print('a' in dic)   # true

# 5.len
print(len(dic))   # 3

# 6.keys/values/items 
print(dic.keys())      # dict_keys(['a', 'b', 'c'])
print(dic.values())    # dict_values([666, 2, 3])
print(dic.items())     # dict_items([('a', 666), ('b', 2), ('c', 3)])

# 7.get
print(dic.get('a'))   # get取值,如果没有返回none

# 8.update
dic1 = {'a': 1, 'c': 2}
dic2 = {'b': 1, 'd': 2}
dic1.update(dic2)
print(dic1)   # {'a': 1, 'c': 2, 'b': 1, 'd': 2}

# 9.fromkeys  创建一个新字典,如没有value值,默认none
print(dic.fromkeys(['a','b','c'], 1))   # {'a': 1, 'b': 1, 'c': 1}

# 10.# setdefault  # 字典有这个key,就不修改,没有则增加
dic.setdefault('j', 2)
dic.setdefault('a', 2)
print(dic)

有序or无序

字典无序

可变or不可变

字典可变

集合内置方法

作用

进行 交集 / 并集 / 补集等运算,可以去重,但是集合内元素是乱序的

定义方式

{}内以逗号隔开多个元素(不能可为变数据类型)

s = {'a', 'a', 'a', 'a', 1, 'v', 2, 2, 'c', 3, 3, 4, 5, 6}  # 对于数字而言,不会乱序;但是对于其他,就乱序
print(s)
# {1, 2, 'a', 3, 4, 5, 6, 'v', 'c'}

使用方法

元组、字典、集合内置方法, 深浅拷贝

se1 = {'cwz', 'neo', 'woods'}
se2 = {'reese', 'chars', 'cwz'}

# 1.并集
print(se1 | se2)    # {'neo', 'reese', 'cwz', 'woods', 'chars'}

# 2.交集
print(se1 & se2)    # {'cwz'}

# 3. 差集
print(se1 - se2)    # {'neo', 'woods'}

# 4.补集
print(se1 ^ se2)   # {'reese', 'chars', 'neo', 'woods'}

# 5.add
se1.add('sad')
print(se1)          # {'neo', 'sad', 'woods', 'cwz'}

# 6.remove / discard
se1.remove('neo')  # 没有的,删除用remove会报错
print(se1)            # {'sad', 'woods', 'cwz'}

se2.discard('chars')  # 没有的,删除用discard不会报错
print(se2)            # {'cwz', 'reese'}

# 7.pop
se1.pop()   # 随机删除值
print(se1)  # {'woods', 'cwz'}

有序or无序

无序

可变or不可变

可变

数据类型总结

存值个数

  • 存一个值:整型 / 浮点型 / 字符串
  • 存多个值:列表 / 元组 / 字典 / 集合

有序or无序

  • 有序:字符串 / 列表 / 元组
  • 无序:字典 / 集合

可变or不可变

  • 可变:列表 / 字典 / 集合
  • 不可变:整型 / 浮点型 / 字符串 / 元组

深浅拷贝

可变or不可变

id值不可变,就是在原值基础上修改,为可变数据类型;

id值变化,就是重新申请一块内存空间放入新值,为不可变数据类型。

拷贝

如果lt2是lt1的拷贝对象,则lt1内任何数据类型的元素变化,lt2也跟着变化。

lt1 = [1,2,3,4,'a',[1,23,5]]
lt2 = lt1
print(lt1)
print('lt1_id: ', id(lt1))
lt1.append('b')
print('*'*50)
print(lt1)
print('lt1_id: ', id(lt1))
print(lt2)
print('lt2_id: ', id(lt2))

# 打印结果:
[1, 2, 3, 4, 'a', [1, 23, 5]]
lt1_id:  1990616507080
**************************************************
[1, 2, 3, 4, 'a', [1, 23, 5], 'b']
lt1_id:  1990616507080
[1, 2, 3, 4, 'a', [1, 23, 5], 'b']
lt2_id:  1990616507080

浅拷贝

如果lt2是lt1的浅拷贝对象,则lt1内的不可变元素发生了变化,lt2不变;

如果lt1内的可变元素发生了改变,则lt2跟着改变

import copy

lt1 = [1, 2, 3, 4, 'a', [1, 23, 5]]
lt2 = copy.copy(lt1)
lt1.append(99)
print('lt1: ', lt1)
print('lt1_id: ', id(lt1))
print('lt2: ', lt2)
print('lt2_id: ', id(lt2))
print('*'*50)
lt1[5].append('qq')
print('lt1[5]: ', lt1)
print('lt1[5]_id: ', id(lt1))
print('lt2: ', lt2)
print('lt2_id: ', id(lt2))

# 打印结果:
lt1:  [1, 2, 3, 4, 'a', [1, 23, 5], 99]
lt1_id:  2049177903816
lt2:  [1, 2, 3, 4, 'a', [1, 23, 5]]
lt2_id:  2049299510728
**************************************************
lt1[5]:  [1, 2, 3, 4, 'a', [1, 23, 5, 'qq'], 99]
lt1[5]_id:  2049177903816
lt2:  [1, 2, 3, 4, 'a', [1, 23, 5, 'qq']]
lt2_id:  2049299510728

深拷贝对象

如果lt2是lt1的深拷贝对象,则lt1内的不可变数据类型元素改变,lt2不变;

如果lt1内的可变数据类型元素改变,lt2不变

import copy

lt1 = [1, 2, 3, [4, 5, 6]]
lt2 = copy.deepcopy(lt1)

print('id(lt1)', id(lt1))
print(id(lt1[0]))
print(id(lt1[1]))
print(id(lt1[2]))
print(id(lt1[3]))
print(id(lt1[3][0]))
print(id(lt1[3][1]))
print(id(lt1[3][2]))

print('*' * 50)

print('id(lt2)', id(lt2))
print(id(lt2[0]))
print(id(lt2[1]))
print(id(lt2[2]))
print(id(lt2[3]))
print(id(lt2[3][0]))
print(id(lt2[3][1]))
print(id(lt2[3][2]))

# 打印结果:
id(lt1) 2156612313800
140728121221968
140728121222000
140728121222032
2156612313736
140728121222064
140728121222096
140728121222128
**************************************************
id(lt2) 2156760304520
140728121221968
140728121222000
140728121222032
2156642018504
140728121222064
140728121222096
140728121222128