《流畅的python》读书笔记(6)

2.5 对序列使用+和*

# 序列使用+ 和 *的一个例子

#  + 号两侧的序列由相同类型的数据
# 所构成,在拼接的过程中,两个被操作的序列都不会被修改,Python 会新建一个包含同样
# 类型数据的序列来作为拼接的结果。
a = ['Chrome','IE']
b = ['ok','zhazha']

c = a + b
print(a)
print(b)
print(c)

# *号 把一个序列复制几份然后再拼接起来 此操作产生一个全新的序列
l = [1,2,3]
print(l)
li = l * 5
print(li)

# 注意
# 如果在 a * n 这个语句中,序列 a 里的元素是对其他可变对象的引用的话 这个式子的结果可能会出乎意料
# 比如,你想用
# my_list = [[]] * 3 来初始化一个由列表组成的列表,但是你得到的列表里包含
# 的 3 个元素其实是 3 个引用,而且这 3 个引用指向的都是同一个列表
my_list = [[]] * 3
my_list[0].append("Hello world")
print(my_list[1])   # ['Hello world']
print(my_list[2])   # ['Hello world']

建立由列表组成的列表

# 初始化一个嵌套着几个列表的列表 , 最好的方式 是用列表推导
l1 = ['_'] * 3
print(l1)  # ['_', '_', '_']

board = [['_'] * 3 for i in range(3)]

print(board)
# [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]

board[1][2] = 'X'
print(board)
# [['_', '_', '_'], ['_', '_', 'X'], ['_', '_', '_']]

# 其本质上等同于
board = []
for i in range(3):
	# 每次循环都创建一个新的列表。并将该列表添加到 board中 所以是三个不同的引用
	row = ["_"] * 3
	board.append(row)
print(board)
# [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
board[2][0] = 'X'
print(board)
# [['_', '_', '_'], ['_', '_', '_'], ['X', '_', '_']]

一种错误的初始化嵌套列表的方式

weird_board = [["_"] * 3] * 3 #看似简单 且简便的初始化方法,但实际上是错误的
print(weird_board)      #[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]

#  一旦我们试图标记第 1 行第 2 列的元素,就立马暴露了列表内的 3 个引用指向同一个
#  对象的事实。
weird_board[1][2] = 0
print(weird_board)
# [['_', '_', 0], ['_', '_', 0], ['_', '_', 0]]

# 其所犯错误与下列本质上是一样的
row = ['_'] * 3
board = []
# 在board中添加了了 同一个 row 对象三次
for i in range(3):
	board.append(row)
发布了32 篇原创文章 · 获赞 6 · 访问量 917

猜你喜欢

转载自blog.csdn.net/EEEEEEcho/article/details/103869006