数据结构与可变性
数据结构 | 可变性 | 构造函数/类型装换函数 |
---|---|---|
数字 | 不可变 | float/int |
字符串 | 不可变 | str/' ' " " ''' ''' |
列表 | 可变 | list/[ ] |
元组 | 不可变 | tuple/( ) |
字典 | 可变 | dict/{ key:value} |
集合 | 可变 | set/{value} |
可变性:创建后就不能改变,无法在原处修改,不可变对象的修改是返回一个新对象
利用类型转换函数进行列表去重
L1=[1,2,3,3,4,4,5,5,5]
L1=list(set(L1))
[1,2,3,4,5]
Python动态类型语言
动态类型语言的核心是:类型没有记录在变量名中,而是记录在被引用的对象中(正好与C语言、C++语言相反)。类型的变换只是让变量名引用了不同的对象而已。
可变对象与共享引用
由于可变对象支持在原处修改,因此会出现共享引用,相互影响的问题
L1=[1,2,3,4]
L2=L1
L1 is L2 # True
L1[0]=2
print(L1) #[2,2,3,4]
print(L2) #[2,2,3,4]
不可变对象不会有以上共享引用的问题,因为所有赋值和改变都返回源对象的拷贝。
若想消除可变对象的共享引用问题,可用如下两种赋值方式
#采用分片方式
L1=[1,2,3,4]
L2=L1[:]
L1 is L2 # False
#使用拷贝模块
import copy
x=copy.copy(y)
x=copy.deepcopy(y)
索引与分片
分片是左闭右开区间 [ ),第三个参数为步长
负数下标索引表示倒序
一条简明法则
可用于多种类型的通用型操作都是以内置函数或表达式的形式出现的(例如len(),list()),但是类型特定的操作是以方法调用的形式出现的(例如aString.upper())
元组
1.元组具有不可变性,是一个常数生命,但可以与列表转换
2.单个列表的元组要加逗号
3.元组的括号可以省略,因此有些看似是多个赋值或返回的语句实际是元组赋值
t=(34,) #tuple t has only one element
def func(a,b,c):
a,b,c=1,2,3 #(a,b,c)=(1,2,3)
return a,b,c # return (a,b,c)
布尔类型
对象 | 值 |
---|---|
"spam" | True |
"" | False |
[] | False |
{} | False |
1 | True |
0.0 | False |
None | False |
True与False不过是整数1和0以不同形式显示后的定制版本而已,只是作为关键字显示而已