day3_python可变的类型、不可变的类型
1、关于存储地址:
1 a=1
2 b=a
3 print('之前的:',b)
4 a=2
5 print('之后的:',b)
为什么会b=a a改变了值,之后b还是等于之前的值呢?
其实这个位置存储的不是变量a,而是变量a的内存地址,a改变了值,变成了另一个内存地址,但是b存储的是a之前的内存地址,所以输出的时候就不会改变。
查询内存地址使用id()
我们可以看到之前的a、b的内存地址是相同的,但是在a改变了值之后,a的内存地址就改变了,但是b存储的是之前的a的内存地址,所以b的内存地址没有改变。
2、元组
定义元组:citites=('beijing','shanghai')
定义元组使用小括号() 定义列表使用中括号[],中间使用逗号隔开。
元组是不可变的,一旦定义好了之后,就不能再变了。
提示的是类型错误,元组对象不支持修改
元组可以使用的内置函数:
1 citites=('beijing','shanghai')
2 print(citites[0]) #查询该下标元素
3 print(citites.count('beijing')) #查询该元素出现的次数
4 print(citites.index('beijing')) #查询该元素下标
3、字符串
在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符。因此改变一个字符串的元素需要新建一个新的字符串。
使用函数replace() 可以修改字符串
4、 依次循环输出列表
1 stus=['saki','yuri','sara','kuma']
2 for i in stus:
3 print(i)
5、依次循环输出字符串的字符
words='红红火火恍恍惚惚'
for word in words:
print(word)
6、切片,list取值的一种方式
切片是顾头不顾尾
stus=['saki','yuri','sara','kuma']
①stus[1:3] 表示取下标从1开始,到3结束,但不包括下标为3的值,所以只取1和2
②stus[:3] 如果不写下标的话,表示从下标0开始到3结束,不包含3
③stus[-1] 表示取最后一个元素
④stus[1:] 不写结尾下标的话,表示取值到结尾
⑤stus[:] 相当于print(stus),取全部list
⑥import string
num=list(string.digits) 强制类型转换成list string.digits表示0-9数字
⑦num[0:11:2] 下标从0开始,到11位不包含11位结束,每个2个元素取一次值,第二个冒号后面的值代表步长。
⑧num[::-1] 步长是负数的话,从右向左取值
⑨num[-6:-10:-1] 步长为负时,是从右向左取值,所以正数是无法取到值的,需要改为负数,-1代表下标为1,-6代表从右往左第6位。
步长为负:
前面两个都不写:则取反;
写第一个,第二个不写:从第一个向左取;
写第二个,第一个不写:从第二个向左取;
写两个:开始位置在结束位置的左侧:取不到;
写两个:开始位置在结束位置右侧:从右往左取。
7、取偶
1 a=[1,1,2,3,4,5,6,43,45,72]
2 for i in a:
3 i%2!=0
4 a.remove(i)
5 print(a)
我们可以看到结果中包含奇数,为什么会这样呢?我们可以查看一下for循环每次取的下标和值
i=0时,不满足条件,删除,列表改为[1,2,3,4,5,6,43,45,72]
i=1时,取值2,跳过下标为0的1,所以会将值1保留,满足条件,列表为[1,2,3,4,5,6,43,45,72]
i=2时,取值3,不满足条件删除,列表为[1,2,4,5,6,43,45,72]
i=3时,取值5,因为删除了下标2的值,所以后面的值向前移动一个下标,所以跳过值4,判断值5,不满足条件删除,列表为[1,2,4,6,43,45,72]
i=4时,取值43,因为删除了下标3的值,所以后面的值向前移动一个下标,跳过值6,判断值43,不满足条件删除,列表为[1,2,4,6,45,72]
i=5时,取值72,因为删除了下标为4的值,所以后面的值向前移动一个下标,跳过值45,判断值72,满足条件,所以保留 最后结果为[1,2,4,6,45,72]
那我们如何解决这个问题呢?
我们可以将a的内存地址赋给另一个变量,我们在b中循环下标,但是修改a的值,不会应该循环本身,所以我们最后的结果与我们预期的结果一致。
1 a=[1,1,2,3,4,5,6,43,45,72]
2 b=a[:]
3 for i in b:
4 i%2!=0
5 a.remove(i)
6 print(a)
8、不引入第三方变量的方式将a,b的值改变
a,b=1,2
b,a=a,b