python数据类型和深浅拷贝

本文介绍了Python中的基本数据类型(整数、浮点数、布尔、字符串),区分了可变数据类型(列表、字典、集合)和不可变类型(基本类型、元组)。还详细讲解了容器类型的操作,以及浅拷贝和深拷贝的区别。
摘要由CSDN通过智能技术生成

1. 基本数据类型

基本数据类型都是可变数据类型

int -- 整数类型

可以表示任意大小的整数,它可以使用非常大的整数而不会溢出

num = 10  # 定义整数类型
print(num)
print(type(num))  # type() 返回数据类型
int(num) # 将变量转换为int类型


# 输出结果
10
<class 'int'>

float -- 浮点数类型

通常情况下,浮点数占用64位的存储空间

fl = 3.14
print(fl)
print(type(fl))


# 输出结果
3.14
<class 'float'>

bool -- 布尔类型

bool类型只有两种取值:True和False,True默认值为1,False默认值为0。

除False、0、0.0、空序列(如空列表[],空字典{}...)、None之外都为True

b1 = True  # True 默认代表 1
b2 = False  # False 默认代表 0
print(b1)
print(type(b1))
print(b2)
print(type(b2))
print(b1 + b2)

# 输出结果
True
<class 'bool'>
False
<class 'bool'>
1

str -- 字符串类型

使用单引号'',或双引号""或三引号''' '''、""" """引起来的内容称之为字符串。

字符串可以通过下标取值,如s[0] -> 取出字符串s下标为0的字符

字符串可以通过"+"的方式拼接

str1 = "abcd123#%%&啊啊啊"
print(str1)
print(len(str1))  # 输出字符串的长度
print(type(str1))

# 输出结果
abcd123#%%&啊啊啊
14
<class 'str'>

切片

字符串可以通过切片的方式取出子字符串

s[0, 4] -> 左闭右开,取出从左下标到右下标之前的部分字符串

s[0, 4, 2] -> 表示每次取离当前元素x个下标的字符,如s="abcdefg",此时s[0, 4, 2]的取值为"ac"

s[-4, -1] -> 负数表示从后往前的下标,-1表示最后一个元素,-2是倒数第二个元素,以此类推,其使用方式与正数下标同理

2. 可变数据类型和不可变数据类型

可变数据类型

可变数据类型是指:当元素值发生改变时,其内存地址值不发生改变的数据类型

可变数据类型包括:

列表(list)、字典(dict)、集合(set)

不可变数据类型

不可变类型是指:当元素值发生改变,其内存地址值也发生改变的数据类型

不可变数据类型包括:

基本数据类型

        整数类型(int)、浮点数类型(float)、布尔类型(bool)、字符串类型(str)

和元组(tuple)

3. 容器类型的数据类型

list -- 列表

列表可以增删改查

列表里面可以存储任意数据类型

可以通过下标和切片的方式获取或访问列表的内容

列表中,append()用于向列表末尾添加元素,insert()用于在指定位置插入一个元素,remove()用于删除列表中指定的元素等

# 列表 -- 可变数据类型
list1 = [1, 2, 3, 4, 5, 'a', 'b', 'c']
# 查询
print(len(list1))  # 长度
print(list1[3])  # 下标取值
print(list1[-1])
print(list1[:])  # 切片
print(list1[::-1])  # -1为步长可反转

# 修改
list1 = [1, 2, 3, 4, 5, 'a', 'b', 'c']
list1[6] = 'h'
print(list1)

# 删除
list1 = [1, 2, 3, 4, 5, 1, 'a', 'b', 'c']
# 1.pop删除 -- 下标
list1.pop() # 默认删除最后一个元素,也可以指定下标
print(list1)
list1.pop(4)
print(list1)
# 2.remove删除 -- 指定一个具体元素 从前往后
list1.remove("a")
list1.remove(1)
print(list1)
# 3.del关键字删除
del list1[2]
print(list1)
# 4.clear 清空列表
list1.clear()
print(list1)

# 新增
list1 = [1, 2, 3, 4, 5, 1, 'a', 'b', 'c']
list1.append("d")
print(list1)
list1.append(['l', 'o', 'l', 'k'])  # 可以添加容器类型数据
print(list1)
list1.extend(['l', 'o', 'l'])  # 将容器拆分添加进来
print(list1)
# 嵌套提取列表的值
print(list1[-4][-1])

tuple -- 元组

元组可以查询,但是不能增删改

元组可以存放任意数据类型

# 元组 -- 不可变数据类型
t1 = 1, 2, 3, 4, 5, 67, 89, 90, 5, 4, 3, 2, 1
# 查询
print(t1[::-1])
print(t1.count(1))  # 获取该元素的出现次数
print(t1.index(1))  # 获取该元素从左往右第一次出现的下标
t2 = ()  # 创建空元组
print(type(t2))

dict -- 字典

字典的key可以存放不可变数据类型(int、float、str、bool、tuple),不能存放可变数据类型

字典的value可以存放任意数据类型

字典可以增删改查

# 字典 -- 可变的数据结构
# 查询
dict1 = {'name': 'litie', 'age': 20, 'sex': '男'}
print(dict1['name'])  # 通过key获取value值
print(dict1['age'])
print(dict1['sex'])

print(dict1.keys())  # 获取所有的key
print(dict1.values())  # 获取所有的value
print(dict1.items())  # 获取所有的键值对

# 快速创建字典
dict2 = dict(a=1, b=2, c=3)
print(dict2)
print(type(dict2))
# 增加数据 update
dict2.update({'d': 4})
print(dict2)
# 如果key已存在,会进行覆盖
dict2.update({'d': 44, 'e': 55, 'f': 66})
print(dict2)
# setdefault 新增但会保留原数据不会覆盖
dict2.setdefault('a', 666)
dict2.setdefault('k', 777)
print(dict2)

# 修改
dict2 = dict(a=1, b=2, c=3, d=44, e=55, f=66)
print(dict2)
dict2['a'] = 666
print(dict2)

# 删除
dict2 = dict(a=1, b=2, c=3, d=44, e=55, f=66)
print(dict2)
dict2.pop('a')
print(dict2)
# 清空
dict2.clear()
print(dict2)

set -- 集合

集合相当于字典的key

可以存放不可变数据类型(int、float、str、bool、tuple),不能存放可变数据类型

# 集合 -- 可变数据结构,无法通过下标查询,无法修改
# 创建空集合
set1 = set()
print(type(set1))
# 新增,会自动去重,所以已有数据的新增无效
set1 = {1, 2, 3, 4, 5, 6, 7, 3, 5, 2, 6, 1, 7, 3, 6, 2, 4, 3, 7}
print(set1)
print(len(set1))
# add 新增
set1.add(9)
print(set1)
# update 新增其他容器类型数据,会拆分
set1.update([11, 22, 33])
print(set1)

# 删除 remove,如果没有该元素会报错
set1 = {1, 2, 3, 4, 5, 6, 7, 3, 5, 2, 6, 1, 7, 3, 6, 2, 4, 3, 7}
set1.remove(3)
print(set1)

列表、元组、集合互相转换

列表、元组、集合之间可以进行互相转换

# 列表、元组、集合互相转换
# 集合转列表
set1 = {1, 2, 3, 4, 5, 6, 7, 3, 5, 2, 6, 1, 7, 3, 6, 2, 4, 3, 7}
list1 = list(set1)
print(list1)
print(type(list1))
# 元组转列表
t1 = (1, 2, 3, 4, 5, 6)
list2 = list(t1)
print(list2)
print(type(list2))

4. 深浅拷贝

浅拷贝

浅拷贝本质上就是让一个变量指向另一个变量的内存地址,如果原数据发生改变,则两个变量所代表的数据也会随之改变。

from copy import copy
str1 = "这是一个字符串"
str2 = copy(str1)

print(id(str1))
print(id(str2))

# 输出结果
2693717940560
2693717940560

深拷贝

深拷贝不是单纯的将地址拷贝过来,而是重新开辟空间,将原数据的内容完全拷贝一份。如果原数据的内部存在引用,该引用所对应的数据也会进行拷贝。

总的来说就是拷贝出一份全新的,但内容与原数据完全一样的数据

str1 = "这是一个字符串"
str2 = deepcopy(str1)
str1 = str1 + 'aaa'
print(str1)
print(id(str1))
print(str2)
print(id(str2))

# 输出结果
这是一个字符串aaa
2233431715216
这是一个字符串
2233428400464

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追梦不止~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值