• 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

  • 相关阅读:
    疯狂学java的第七天
    疯狂学java的第六天
    疯狂学java的第五天
    学java的第四天
    学java的第三天
    javaSE_20_常用API(包装类丶BigInteger类丶BigDecimal类 )
    javaSE_19_常用API(String类丶StringBuffer类)
    javaSE_17_内部类丶常用的引用类型用法总结
    javaSE_15_package和import丶访问控制权限
    javaSE_14_抽象类丶接口
  • 原文地址:https://www.cnblogs.com/miyuki/p/9151912.html
Copyright © 2020-2023  润新知