当前位置: 首页 > news >正文

python中字典copy_python中字典、元祖、浅拷贝、深拷贝

# -*- coding:utf-8 -*-

#yys

#python 3.7.2

#1. 什么是元祖

# Python的元组与列表类似,不同之处在于元组的元素不能修改。#

# 元组使用小括号,列表使用方括号。#

# 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

# 1> 可以用元祖告诉读代码的人,你不打算改变这个序列的值。

# 2> 因为元祖的不可变性,python可以实现一些优化

importtime

T1=time.time()

fori intuple(range(1000)):

pass

T2=time.time()

print("%.1f"%((T2-T1)*1000),"毫秒") #500.0 毫秒

T3=time.time()

fori inlist(range(1000)):

pass

T4=time.time()

print("%.1f"%((T4-T3)*1000),"毫秒") #500.0 毫秒

# 元祖创建语法

# 元祖名=(元素1,元素2,元素n…….)

tuple0=()

print(tuple0) #('早餐',)

print(type(tuple0)) #

tuple1="早餐",

print(tuple1) #('早餐',)

print(type(tuple1)) #

tuple2=("早餐",)

print(tuple2) #('早餐',)

print(type(tuple2)) #

tuple3="早餐","午餐"

print(tuple3) #('早餐', '午餐')

print(type(tuple3)) #

tuple4=("早餐","午餐")

print(tuple4) #('早餐', '午餐')

print(type(tuple4)) #

# 2.操作元祖

#2.1 要访问元祖中的tom,与访问列表、字符的方法一致

#索引从0开始

tuple5=("耶鲁","楼梯","道路","棕榈树")

print(tuple5[1]) #楼梯

#2.2 删除元祖

# 元祖和列表不一样,元祖中的元素值是不允许被单独修改和删除的,但是我们可以使用del语句来删除整个元祖

#不可删除元祖中单个元素

tuple6=("高楼","楼梯","道路","雕像")

deltuple6

try:

print(tuple6)

exceptException ase:

print(e)

# name 'tuple6' is not defined

# 2.3 元组截取,与字符串/列表表的截取一致

tuple7=("高楼","楼梯","道路","雕像","飞盘","美术馆")

print("截取元素0:3",tuple7[0:3]) #截取元素0:3 ('高楼', '楼梯', '道路')

#2.4 元祖嵌套,与字典,列表一样

tuple8=("高楼",("楼梯","道路","雕像"),("飞盘"),"美术馆")

print(tuple8) #('高楼', ('楼梯', '道路', '雕像'), '飞盘', '美术馆')

print(type(tuple8)) #

tuple9=("高楼",("楼梯","道路","雕像"),("飞盘",),"美术馆")

print(tuple9) #('高楼', ('楼梯', '道路', '雕像'), ('飞盘',), '美术馆')

print(tuple9[1][2]) #雕像

print(type(tuple9)) #

#3 元祖函数

# len(tuple) 计算元祖中元素的个数

tuple10=(1,2,3,4,"早上",("早餐","午餐"))

print(len(tuple10)) #6

# max(tuple) 返回列表元素中的最大值。

tuple10=(1,-2,3,40)

print(max(tuple10)) #40

# min(tuple) 返回列表元素中的最小值。

print(min(tuple10)) #-2

# 4.tuple(list) 将列表转换为元祖

list1=["雷诺"]

print(tuple(list1)) #('雷诺',)

print(type(tuple(list1))) #

# 5.什么是字典

# 字典是另外一种可变容器类型,且可以存储任意类型对象。

# 列表元素进行修改的话,通过索引进行修改;

# 而字典通过键去修改值。

# 字典创建语法:字典的创建使用{},每个键值(key=>value)对用冒号(:)分割,每对之间用逗号(,)分割。

# 字典名={key1:value1,key2:value2}

students={'name':'厨房','age':28,'sex':'女',28:19}

print(students) #{'name': '厨房', 'age': 28, 'sex': '女', 28: 19}

print(type(students)) #

#6. 操作字典

#6.1 字典中根据键访问值,放在方括号内的键。

print(students['name']) #厨房

#6.2添加元素 动态的向字典中添加元素的时候,只要添加的键在字典中不存在,就会新增这个元素。

students['美食']="蛋糕"

print(students) #{'name': '厨房', 'age': 28, 'sex': '女', 28: 19, '美食': '蛋糕'}

#6.3 删除字典元素

# 使用del语句删除元素:del既可以删除指定的字典元素(列表也可以指定),也可以删除整个字典,

# 如果不指定key,代表删除整个字典。语法如下:

# del 字典名[key]

dict1={'name':'厨房','age':28,'sex':'女'}

deldict1['age']

print(dict1) #{'name': '厨房', 'sex': '女'}

deldict1

try:

print(dict1)

exceptException ase:

print(e)

# 'dict1' is not defined

# 使用clear()方法清空整个字典:

# 被清空的字典最后会剩下一个空的字典在,而用del删除的字典在程序当中就不存在了。

dict2={'name':'厨房','age':28,'sex':'女'}

dict2.clear()

print(dict2) #{}

# 按键名删除 字典名.pop(‘键名’)

dict3={'name':'厨房','age':28,'sex':'女','形状':'球',28:19,"美食":"蛋糕"}

dict3.pop('name')

print(dict3) #{'age': 28, 'sex': '女', '形状': '球', 28: 19, '美食': '蛋糕'}

# Python 字典 popitem() 方法随机返回并删除字典中的一对键和值(一般删除末尾对)。

# 如果字典已经为空,却调用了此方法,就报出KeyError异常。

print(dict3.popitem())#('美食', '蛋糕')

print(dict3) #{'age': 28, 'sex': '女', '形状': '球', 28: 19}

# 7.字典函数&方法

# len(dict) 计算字典中元素的个数

dict4={'name':'Tom','age':18}

print(len(dict4)) #2

# str(dict) 输出字典,以可打印的字符串表示

dict5={'name':'Tom','age':18,'sex':'男',18:19}

str1=str(dict5)

print(str1) #{'name': 'Tom', 'age': 18, 'sex': '男', 18: 19}

print(type(str1)) #判断str1的数据类型

# type(variable) 返回输入变量的数据类型,如果变量是字典就返回

dict6={'name':'Tom'}

print(type(dict6)) #

# dict.keys() 以字典键的形式返回一个字典所有的键

dict7={'name':'Tom','age':18,'sex':'男',18:19}

print(dict7.keys()) #dict_keys(['name', 'age', 'sex', 18])

print(type(dict7.keys())) #

# key in dict 如果键在字典dict里返回true,否则返回false

print('name'indict7) #True

# dict.values() 以字典值得形式返回一个字典中的所有值

print(dict7.values()) #dict_values(['Tom', 18, '男', 19])

print(type(dict7.values())) #

# dict.get(key,default=None) 返回指定键的值,如果值不在字典中返回default值(default不传参则为None)

print(dict7.get('name')) #Tom

print(dict7.get('name1')) #None

# dict.fromkeys(seq[,value]) 创建一个新字典,以序列seq中元素做字典的值,value为字典所有键对应的初始值([],[])

seq=('name','age','sex')

dict8=dict.fromkeys(seq)

print(dict8) #{'name': None, 'age': None, 'sex': None}

dict9=dict.fromkeys(seq,'jack')

print(dict9)#{'name': 'jack', 'age': 'jack', 'sex': 'jack'}

seq2=('TOM','18','男')

dict10=dict.fromkeys(seq,seq2)

print(dict10)#{'name': ('TOM', '18', '男'), 'age': ('TOM', '18', '男'), 'sex': ('TOM', '18', '男')}

# 构建字典的 2 个列表/元祖中的元素相同

dict11=dict(zip(seq,seq2))

print(dict11) #{'name': 'TOM', 'age': '18', 'sex': '男'}

#构建字典的 2 个列表/元祖中的元素不同(key比value多)

a1 = [1, 2, 3, 4]

c1 = ['aa', 'ss']

print(dict(zip(a1,c1)))#{1: 'aa', 2: 'ss'}

# 构建字典的2个列表/元祖中的元素不同(key比value少)

a2 = [1, 2, 3, 4]

d2 = ['fa','fb','fc','fd','fe']

print( dict(zip(a2,d2)))#{1: 'fa', 2: 'fb', 3: 'fc', 4: 'fd'}

# dict.setdefault(key,default=None) 和get类似,但如果键不存在于字典中,将会添加键并将值设为default

dict12={'name':'Tom','age':18,'sex':'男',18:19}

print(dict12.setdefault("name"))#Tom

print(dict12)#{'name': 'Tom', 'age': 18, 'sex': '男', 18: 19}

print(dict12.setdefault("name1"))#None

print(dict12)#{'name': 'Tom', 'age': 18, 'sex': '男', 18: 19, 'name1': None}

# 8.什么是集合

# 集合是基本的数学概念,它是集合论的研究对象,指具有某种特定性质的事物的总体,

# (在最原始的集合论─朴素集合论─中的定义,集合就是“一堆东西”。)集合里的事物(“东西”),叫作元素。

#相当于把字典丢弃掉(value)值, 只有key(不可变,不可重复)

# 集合: s1={'a','b','c'}

# set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

# 可以使用set方法传入一个字符串,形成一个集合

# 可以使用for in访问集合中的元素

# 也能转换为l列表形式,执行访问操作

# 增加元素add 删除元素remove

# 集合具有交集 ,并集, 差集

x = set('runoob')

y = set('google')

## 重复的被删除

print(x,y)#{'r', 'u', 'o', 'b', 'n'} {'e', 'o', 'l', 'g'}

# 交集

print(x & y )#{'o'}

# 并集

print(x | y )#{'r', 'l', 'g', 'u', 'o', 'b', 'e', 'n'}

# 差集

print(x - y )#{'n', 'r', 'b', 'u'}

# 浅拷贝与深拷贝

# Python中string、tuple和number是不可变对象,而dict、list等是可变对象

# 不可变对象在进行重新赋值的时候,实际上是将原始值丢弃,将变量指向一个新值;

# 可变对象的可变性实质上是指更改可变对象中的子对象,比如list中的item元素的更改。

# 直接赋值:其实就是对象的引用(起个 别名)

a3 = [1,2,3]

b3 = [11,22,33]

c3 = [111,222,333]

var01 = [a3,b3,c3]

var02 = var01 #起别名

print(var01)

print(var02)

#id 获取变量在内存中的地址

print(id(var01)) #2869237497224

print(id(var02))#2869237497224

print('-------------------------')

a3.append(4) # a插入一个新元素

print(var01)

print(var02)

#id 获取变量在内存中的地址

print(id(var01))#2573024608072

print(id(var02))#2573024608072

print('-'*30)

a4 = (1,2,3)

b4 = (11,22,33)

c4 = (111,222,333)

var03 = (a4,b4,c4)

var04 = var03 #起别名

print(var03)

print(var04)

#id 获取变量在内存中的地址

print(id(var03))#2417112784760

print(id(var04))#2417112784760

# 浅拷贝:不拷贝子对象(针对子对象中的item),当子对象进行更改的时候,原始对象也会改变。

# 常见操作:列表的切片[:]操作、list()操作,

# 字典的copy()函数、copy模块的copy()函数(两个一模一样的双胞胎)

# 深拷贝:会拷贝子对象,当对原始对象子对象进行更改的时候,原始对象不会改变。

# 常见操作:copy模块的deepcopy()函数

# 浅拷贝,只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。

# 深拷贝,外围和内部元素都进行了拷贝对象本身,而不是引用。

# 但是对于数字,字符串和元组类型对象,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,

# 如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已。

#

importcopy

a = [1, 2, 3, 4, ['a', 'b']]

b = a

c = copy.copy(a) #浅拷贝

d = copy.deepcopy(a)#深拷贝

a.append(5)

a[4].append('c')

print("*"*20)#********************

print (a) #[1, 2, 3, 4, ['a', 'b', 'c'], 5]

print(id(a[4]))#2045327748488

print(id(b[4]))#2045327748488

print(id(c[4]))#2045327748488

print(id(d[4]))#2045327829960

print('a = ', a) #a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]

print('b = ', b) #b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]

print('c = ', c) #c = [1, 2, 3, 4, ['a', 'b', 'c']]

print('d = ', d) #d = [1, 2, 3, 4, ['a', 'b']]

相关文章:

  • javascript在IE和Firefox中的兼容考虑
  • python计算两字符串中的位置,从Python中的字符串中获取两个字符
  • 读者skyfalling:《.NET 2.0面向对象编程揭秘》读后有感
  • sql查询行数_千万级数据表选错索引导致的线上慢查询事故
  • BIEE创建时间维报NQSError
  • ppt倒计时_逼得知乎大神写程序解决的PPT倒计时,我花7秒钟搞定了
  • SAP一句话入门
  • 一寸照片压缩到20k_压缩机油更换注意事项-杭州华力制冷维修小知识
  • 《深入解析Oracle》一书前言
  • python远程调试_python基础===利用PyCharm进行Python远程调试(转)
  • JAVA实现整句汉字拆分、转换为ASCII
  • numpy有什么功能python_Numpy的介绍与基本使用方法
  • 在Window XP家庭版上安装IIS
  • python中表达式4+0.5值的数据类型为_Python之路【第五篇】:Python基本数据类型
  • 单片机c语言必背代码_单片机入门-要从汇编开始
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Bootstrap JS插件Alert源码分析
  • echarts的各种常用效果展示
  • js中的正则表达式入门
  • Laravel核心解读--Facades
  • pdf文件如何在线转换为jpg图片
  • webpack+react项目初体验——记录我的webpack环境配置
  • windows下mongoDB的环境配置
  • 创建一个Struts2项目maven 方式
  • 大整数乘法-表格法
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 解析带emoji和链接的聊天系统消息
  • 深入浅出Node.js
  • 限制Java线程池运行线程以及等待线程数量的策略
  • k8s使用glusterfs实现动态持久化存储
  • 阿里云ACE认证之理解CDN技术
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #define
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (多级缓存)多级缓存
  • (三)uboot源码分析
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • **PHP分步表单提交思路(分页表单提交)
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——