类似列表的数据类型

字符串和元组


一、字符串

  列表不是唯一表示序列值的数据类型。字符串跟列表也很相似,只要简单的认为字符串是单个文本字符的列表。对于列表的很多操作字符串也可以用。

  下标,切片,for循环,len()函数,in和not in操作符都可以用于字符串

  为了看出效果,我们给出“我喜欢学习python”的字符串来验证:

jack = "我喜欢学习python"
print("查询到的字符是:"+jack[1])
print("查询到的字符串是:"+jack[4:])
print("字符串的长度:"+str(len(jack)))
if "python" not in jack:
    print("python子字符串在jack中")
else:
    print('不在')
for i in jack:
    print(i)
C:\Users\leiyonggang\anaconda3\python.exe C:/Users/leiyonggang/PycharmProjects/kv-demo/python基础/demo2.py
查询到的字符是:喜
查询到的字符串是:习python
字符串的长度:11
不在
我
喜
欢
学
习
p
y
t
h
o
n

Process finished with exit code 0
运行结果

  让我们来真正的区别字符串和列表:可变和不可变数据类型

    ——列表是可变数据类型,他的元素是可以增删改的

    ——字符串是不可变数据类型,尝试对字符串中的一个字符重新赋值,将会导致TypeError的错误

    ——注意:改变一个字符串的正确方式是切片和连接        


        # 我们依然对上面的字符串进行修改,的到“jack喜欢python”
        str = "jack"+jack[1:3]+jack[5:]
        print(str)

    ①看下面这些代码:

      >>>eggs = [1,2,3]

      >>>eggs = [4,5,6]

      >>>eggs

      [4,5,6]

      这里eggs中列表值并没有发生改变,而是被[4,5,6]的新列表给覆盖了

      

 

 

    ②如果你真的想改变原来列表的值:

      >>> eggs = [1,2,3]

      >>> del eggs[2]

      >>> del eggs[1] 

      >>> del eggs[0]

      >>> eggs.append(4)  

      >>> eggs.append(5)

      >>> eggs.append(6) 

      >>> eggs

      [4,5,6]

       

 

 

   区分可变和不可变似乎没有意义,接下来我们一起看元组

二、元组(列表数据的不可变类型)

  结构:name = (1,23,,45,6,7,5)

  注意元组的值不能被增删改

三、用list()和tuple()函数来准换类型

  我们将学生姓名列表list准换为元组,目前不用发生改变 

stu =['唐僧','孙悟空','猪八戒','沙和尚']
    tup = tuple(list)
    print(tup)

  但是过了没多久,“观音”又加入了新班级

stu =['唐僧','孙悟空','猪八戒','沙和尚']
tup = tuple(stu)
print(tup)
list1 = list(tup)
list1.append('观音')
print(list1)

四、引用  

    正如你看到的,变量保存字符串和整数值。以下代码:

    >>> spam = 42
    >>> cheese = spam
    >>> spam = 100
    >>> spam
    100
    >>> cheese
    42
  
你将 42 赋给 spam 变量,然后拷贝 spam 中的值,将它赋给变量 cheese。当稍
  后将 spam中的值改变为 100 时,这不会影响cheese中的值。这是因为 spam和   cheese是不同的变量,保存了不同的值。

  但列表不是这样的。当你将列表赋给一个变量时,实际上是将列表的“引用”
赋给了该变量。引用是一个值,指向某些数据。列表引用是指向一个列表的值。这
里有一些代码,让这个概念更容易理解。以下代码:
    >>> spam = [0, 1, 2, 3, 4, 5]
    >>> cheese = spam
    >>> cheese[1] = 'Hello!'
    >>> spam
    [0, 'Hello!', 2, 3, 4, 5]
    >>> cheese
    [0, 'Hello!', 2, 3, 4, 5]
  这可能让你感到奇怪。代码只改变了 cheese 列表,但似乎 cheese 和 spam 列表
同时发生了改变。
  记住,变量就像包含着值的盒子。本章前面的图显示列表在盒子中,这并不准
确,因为列表变量实际上没有包含列表,而是包含了对列表的“引用”(这些引用
包含一些 ID 数字,Python 在内部使用这些 ID,但是你可以忽略)。利用盒子作为
变量的隐喻,

  

 

 

 

   spam = [0, 1, 2, 3, 4, 5]保存了对列表的引用,而非实际列表
  然后,spam 中的引用被复制给 cheese。只有新的引用被创建并保
存在 cheese 中,而非新的列表。请注意,两个引用都指向同一个列表。

 

 

 

 

    spam = cheese 复制了引用,而非列表
  当你改变 cheese 指向的列表时,spam 指向的列表也发生了改变,因为 cheese
和 spam 都指向同一个列表

 

 

 

    cheese[1] = 'Hello!'修改了两个变量指向的列表
  变量包含对列表值的引用,而不是列表值本身。但对于字符串和整数值,变量
就包含了字符串或整数值。在变量必须保存可变数据类型的值时,例如列表或字典,
Python 就使用引用。对于不可变的数据类型的值,例如字符串、整型或元组,Python
变量就保存值本身。
  虽然 Python 变量在技术上包含了对列表或字典值的引用,但人们通常随意地
说,该变量包含了列表或字典

六 、copy()模块和deepcopy()函数  

import copy
stu =['唐僧','孙悟空','猪八戒','沙和尚']
tup = tuple(stu)
print(tup)
list1 = list(tup)
list1.append('观音')
list2 = copy.copy(list1)
list2[2]='如来'
print(list1)
print(list2)

如果要复制的列表中包含了列表,那就使用 copy.deepcopy()函数来代替。
deepcopy()函数将同时复制它们内部的列表。

上一节       下一节   返回目录

 

posted @ 2021-01-10 12:36  贫僧敲代码  阅读(102)  评论(0)    收藏  举报