字符串和列表实际上很相似,只要你认为字符串是单个文本字符的列表。对列表的许多操作, 也可以作用于字符串:按下标取值、 切片、 用于 for 循环、 用于 len(), 以及用于 in 和 not in 操作符。
>>> name='markerjson'
>>> name[0]
'm'
>>> name[-1]
'n'
>>> 'json' in name
True
>>> for s in name:
print("***"+s)
***m
***a
***r
***k
***e
***r
***j
***s
***o
***n
可变和不可变数据类型
列表和字符串在一个重要的方面是不同的。列表是“可变的” 数据类型,它的值可以添加、 删除或改变。但是, 字符串是“不可变的”, 它不能被更改。
>>> name[0]='a'
Traceback (most recent call last):
File "", line 1, in
name[0]='a'
TypeError: 'str' object does not support item assignment
'改变' 一个字符串的正确方式, 是使用切片和连接。构造一个“新的” 字符串, 从老的字符串那里复制一些部分。
>>> name='this is a book'
>>> newName=name[:8]+'the'+[9:]
SyntaxError: invalid syntax
>>> newName=name[:8]+'the'+name[9:]
>>> newName
'this is the book'
元组数据类型
除了两个方面,“元组” 数据类型几乎与列表数据类型一样。首先, 元组输入时用圆括号(), 而不是用方括号[]。元组与列表的主要区别还在于,元组像字符串一样, 是不可变的。
>>> eggs=('hello',42,0.5)
>>> eggs
('hello', 42, 0.5)
>>> eggs[0]
'hello'
>>> eggs[0:3]
('hello', 42, 0.5)
>>> len(eggs)
3
>>> eggs[0]=0
Traceback (most recent call last):
File "", line 1, in
eggs[0]=0
TypeError: 'tuple' object does not support item assignment
>>> del eggs[0]
Traceback (most recent call last):
File "", line 1, in
del eggs[0]
TypeError: 'tuple' object doesn't support item deletion
>>> eggs
('hello', 42, 0.5)
如果元组中只有一个值, 你可以在括号内该值的后面跟上一个逗号, 表明这种情况。 否则, python 将认为, 你只是在一个普通括号内输入了一个值。逗号告诉 python, 这是一个元组。
>>> type(('hello'))
>>> type(('hello','hw'))
>>> type(('hello',))
用 list()和 tuple()函数来转换类型
>>> eggs
('hello', 42, 0.5)
>>> list(eggs)
['hello', 42, 0.5]
>>> eggs
('hello', 42, 0.5)
>>> eggs=list(eggs)
>>> eggs
['hello', 42, 0.5]
>>> tuple(eggs)
('hello', 42, 0.5)
>>> eggs
['hello', 42, 0.5]
>>> eggs=tuple(eggs)
>>> eggs
('hello', 42, 0.5)
引用
当你将列表赋给一个变量时,实际上是将列表的“引用”赋给了该变量。变量包含对列表值的引用, 而不是列表值本身。但对于字符串和整数值,变量就包含了字符串或整数值。<span class="cblue">当列表或字典赋值变量时,python 就使用引用。
对于不可变的数据类型的值,例如字符串、整型或元组, python 变量就保存值本身。
传递引用:当函数被调用时, 参数的值被复制给变量。对于列表(以及字典),这意味着变量得到的是引用的拷贝。
def appendColor(ns):
ns.append('green')
print(ns)
def ts():
color=['blue','yellow','red']
appendColor(color)
print(color)
ts()
['blue', 'yellow', 'red', 'green']
['blue', 'yellow', 'red', 'green']
copy 模块的 copy()和 deepcopy()函数
copy.copy() 可以用来复制列表或字典这样的可变值,而不只是复制引用。
deepcopy() 函数将同时复制它们内部的列表。
>>> spam=[1,2,3]
>>> name=spam
>>> name.append(4)
>>> spam
[1, 2, 3, 4]
>>> name
[1, 2, 3, 4]
>>> import copy
>>> name=copy.copy(spam)
>>> name
[1, 2, 3, 4]
>>> name[0]=10
>>> name
[10, 2, 3, 4]
>>> spam
[1, 2, 3, 4] ## copy之后spam没有被修改
>>> spam=[[1,2,3],[4,5,6]]
>>> name=spam
>>> name.append([7,8,9])
>>> spam
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> name=copy.copy(spam)
>>> name.append([10,11,12])
>>> name
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
>>> spam
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] ## copy之后第一层数据没有被修改
>>> name[0][0]=10 ## 修改第二层数据
>>> spam
[[10, 2, 3], [4, 5, 6], [7, 8, 9]] ## copy之后第二层数据被修改了
>>> name=copy.deepcopy(spam) ## 深度copy,内部列表将都会以值的形式复制
>>> name
[[10, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> name[0][0]=1 ## 修改第二层数据
>>> name
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> spam ## deepcopy后不再受影响
[[10, 2, 3], [4, 5, 6], [7, 8, 9]]
字符图网格
## 假定有一个列表的列表, 内层列表的每个值都是包含一个字符的字符串, 像这样:
## grid = [['.', '.', '.', '.', '.', '.'],
## ['.', 'O', 'O', '.', '.', '.'],
## ['O', 'O', 'O', 'O', '.', '.'],
## ['O', 'O', 'O', 'O', 'O', '.'],
## ['.', 'O', 'O', 'O', 'O', 'O'],
## ['O', 'O', 'O', 'O', 'O', '.'],
## ['O', 'O', 'O', 'O', '.', '.'],
## ['.', 'O', 'O', '.', '.', '.'],
## ['.', '.', '.', '.', '.', '.']]
## 认为 grid[x][y]是一幅“图” 在 x、 y 坐标处的字符, 该图由文本字符组
## 成。 原点(0, 0)在左上角, 向右 x 坐标增加, 向下 y 坐标增加。
## 复制前面的网格值, 编写代码用它打印出图像。
## ..OO.OO..
## .OOOOOOO.
## .OOOOOOO.
## ..OOOOO..
## ...OOO...
## ....O....
def pgrid():
grid = [['.', '.', '.', '.', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['O', 'O', 'O', 'O', 'O', '.'],
['.', 'O', 'O', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['.', '.', '.', '.', '.', '.']]
r=len(grid)
c=len(grid[0])
for m in range(0,c):
for n in range(0,r):
print(grid[n][m],end='')
print()
pgrid()