08.类型转换、深浅拷贝


01.类型转换
02.深浅拷贝
03.可变对象
04.不可变对象

01.类型转换

在这里插入图片描述

1.1 int()

int():转换为一个整数,只能转换由纯数字组成的字符串
float->int

a = 1.2
print(type(a))
b = int(a)
print(type(b))
#浮点型强转整型会去掉小数点及后面的数值,只保留整数部分

在这里插入图片描述

str->int
如果字符串中有数字和正负号(+/-)以外的字符就会报错
+/-写在前面表示正负号,不可以写在后面

a = 'a'
print(type(a))
b = int(a)   #只能转换由纯数字组成的字符串
print(type(b))

在这里插入图片描述

a = '123'
print(type(a))
b = int(a)
print(type(b))

在这里插入图片描述

age = input("请输入您的年龄:") #input默认输入的是字符串类型
if int(age) >= 18:
print("成年了")

在这里插入图片描述

1.2 float

float():转换为一个小数
整型转换为浮点型,会自动添加一位小数
如果字符串中有正负号、数字和小数点以外的字符,则不支持转换

print(float(11))
print(float(-11))
print(float('+11.345'))
print(float('11-'))

在这里插入图片描述

1.3 str()

str():转换为字符串类型,任何类型都可以转换成字符串类型

n = 100
print(type(n)) #<class 'int'>
n2 = str(n)
print(n2,type(n2)) #100 <class 'str'>

st = str(-1.80) #float转换成str会取出末位为0的小数部分
print(st,type(st)) #-1.8 <class 'str'>

li = [1,2,3]
print(li,type(li)) #[1, 2, 3] <class 'list'>
st = str(li)
print(st,type(st)) #[1, 2, 3] <class 'str'>

1.4 eval()

eval():用来执行一个字符串表达式,并返回表达式的值

print(10 + 10) #20
print('10' + '10') #1010
print('10 + 10') #10 + 10
print(eval('10 + 10')) #20 执行运算,并返回运算值
print(eval('10' + '10')) #1010

eval()可以实现list、dict、tuple和str之间的转换
(1)str->list

st1 = '[[1,2],[3,4],[5,6]]'
print(st1,type(st1)) #[[1,2],[3,4],[5,6]] <class 'str'>
li = eval(st1)
print(li,type(li)) #[[1, 2], [3, 4], [5, 6]] <class 'list'>

(2)str->dict

st2 = "{'name':'bingbing','age':18}"
dic = eval(st2)
print(dic,type(dic)) #{'name': 'bingbing', 'age': 18} <class 'dict'>

eval()非常强大,但是不够安全,容易被恶意修改数据,不建议使用

1.5 list()

list():将可迭代对象转换成列表
支持转换为list的类型:str、tuple、dict、set
str()->list()

print(list('abcdefg')) #['a', 'b', 'c', 'd', 'e', 'f', 'g']
# #print(list(12345)) #报错

tuple()->list()

print(list((1,2,3,4))) #[1, 2, 3, 4]

在这里插入图片描述

dict()->list()
字典转换成列表,会取键名作为列表的值

print(list({'name':'xiaoming','age':15})) #['name', 'age']

在这里插入图片描述

set() ->list()
基本转换成列表,会先去重,再转换

print(list({'a','b','c','d'})) #['b', 'c', 'a', 'd']
print(list({'a','b','c','d','b'})) #['b', 'c', 'a', 'd']

02.深浅拷贝

浅拷贝:浅拷贝是对于一个对象的顶层拷贝, 拷贝了最外层的对象,内部的元素只拷贝了一个引用。
深拷贝:深拷贝是对于一个对象所有层次的拷贝 (外层的对象和内部的元素都拷贝了一遍)
浅拷贝:节省资源和内存空间
深拷贝:数据拷贝更加安全

2.1 赋值

赋值:会随着元对象一起变量
赋值:等于完全共享资源,一个值的改变会完全被另一个值共享

li = [1,2,3,4]
print(li)
li2 = li
print(li2)
#查看内存地址 id()
print('li内存地址:',id(li))
print('li2内存地址:',id(li2))
#给li列表新增元素
li.append(5)
print('新增后的li',li)
print('新增后的li2',li2)

在这里插入图片描述

2.2 浅拷贝(数据半共享)

浅拷贝:会创建新的对象,拷贝第一层的数据,嵌套层会指向原来的内存地址
import copy #导入copy模块

li = [1,2,3,[4,5,6]] #定义一个嵌套列表
print(li)
li2 = copy.copy(li) #浅拷贝
print(li2)
#查看内存地址 id()
print('li内存地址:',id(li))
print('li2内存地址:',id(li2))
#内存地址不一样,说明不是同一个对象

#给li列表新增元素
li.append(5)
print('新增后的li',li)
print('新增后的li2',li2)

#查看内存地址 id()
print('li内存地址:',id(li))
print('li2内存地址:',id(li2))

#往嵌套列表添加元素
li[3].append(7)
print('li:',li)
print('li2:',li2)
print('li[3]内存地址:',id(li[3]))
print('li2[3]内存地址:',id(li2[3]))
#外层的内存地址不同,但是内层的内存地址相同

在这里插入图片描述

优点:拷贝速度快,占用空间少,拷贝效率高

2.3 深拷贝(数据完全不共享)

深拷贝:外层的对象和内部的元素都拷贝了一遍
import copy #导入copy模块

li = [1,2,3,[4,5,6]] #定义一个嵌套列表
print(li)
li2 = copy.deepcopy(li) #深拷贝
print(li2)
#查看内存地址 id()
print('li内存地址:',id(li))
print('li2内存地址:',id(li2))
#内存地址不一样,说明不是同一个对象

#给li列表新增元素
li.append(5)
print('新增后的li',li)
print('新增后的li2',li2)

#查看内存地址 id()
print('li内存地址:',id(li))
print('li2内存地址:',id(li2))

#往嵌套列表添加元素
li[3].append(7)
print('li:',li)
print('li2:',li2)
print('li[3]内存地址:',id(li[3]))
print('li2[3]内存地址:',id(li2[3]))
#外层的内存地址不同,内层的内存地址也不相同
#深拷贝数据变化只影响自己本身,跟原来的对象没有关联

在这里插入图片描述

03.可变对象

可变对象:存储空间保存的数据允许被修改,这种数据就是可变类型。

==常见的可变类型有: ==
列表 list 字典 dict 集合 set

含义:变量对应的值可以修改,但是内存地址不会发生改变

li = [1,2,3,4]
print('li的原内存地址:',id(li),li)
li.append(5)
print('li的现内存地址:',id(li),li)

在这里插入图片描述

dic = {'name':'xiaoming','age':20}
print('dic的原内存地址:',id(dic),dic)
dic['name'] = 'jack'
print('dic的现内存地址:',id(dic),dic)

在这里插入图片描述

set = {1,2,3,4,5}
print('set的原内存地址:',id(set),set)
set.remove(4)
print('set的现内存地址:',id(set),set)

在这里插入图片描述

04.不可变对象

不可变对象:存储空间保存的数据不允许被修改,这种数据就是不可变类型。

==常见的不可变类型有: ==
1.数值类型 int, bool, float, complex
2.字符串 str
3.元组 tuple

含义:变量对应的值不能被修改,如果修改就会生成一个新的值从而分配新的内存空间

n = 10
print('原地址:',id(n),n)
n = 15
print('现地址:',id(n),n)
#内存地址不一样:修改n的值就会生成新的值,重新赋值给变量n

在这里插入图片描述

str = 'a'
print('原地址:',id(str),str)
str = 'book'
print('现地址:',id(str),str)

在这里插入图片描述

tua = (1,2,3,4)
print('tua的原内存地址:',id(tua),tua)
tua = ('a',"b",'c')
print('tua的现内存地址:',id(tua),tua)

在这里插入图片描述

注意:前面所说的深浅拷贝只针对可变对象,不可变对象没有深浅拷贝

学习地址:https://www.bilibili.com/video/BV1FS421K7Hs/?p=16&spm_id_from=pageDriver&vd_source=279585e3656eb1829d1f31997be26270

相关推荐

  1. python的深浅拷贝

    2024-04-05 00:20:01       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-05 00:20:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-05 00:20:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-05 00:20:01       87 阅读
  4. Python语言-面向对象

    2024-04-05 00:20:01       96 阅读

热门阅读

  1. MySQL常见故障与优化

    2024-04-05 00:20:01       41 阅读
  2. IP知识详解

    2024-04-05 00:20:01       39 阅读
  3. Golang基础-10

    2024-04-05 00:20:01       36 阅读
  4. 大模型日报2024-04-03

    2024-04-05 00:20:01       45 阅读
  5. 软考之零碎片段记录(五)

    2024-04-05 00:20:01       33 阅读
  6. 速盾:cdn节点存储空间怎么管理

    2024-04-05 00:20:01       42 阅读