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

posted @ 2018-08-31 22:44  伞落雨晴  阅读(104)  评论(0编辑  收藏  举报