【发布时间】:2010-11-01 18:35:56
【问题描述】:
我正在阅读How to think like a computer scientist,这是“Python 编程”的介绍性文本。
我想澄清乘法运算符 (*) 应用于列表时的行为。
考虑函数 make_matrix
def make_matrix(rows, columns):
"""
>>> make_matrix(4, 2)
[[0, 0], [0, 0], [0, 0], [0, 0]]
>>> m = make_matrix(4, 2)
>>> m[1][1] = 7
>>> m
[[0, 0], [0, 7], [0, 0], [0, 0]]
"""
return [[0] * columns] * rows
实际输出是
[[0, 7], [0, 7], [0, 7], [0, 7]]
make_matrix 的正确版本是:
def make_matrix(rows, columns):
"""
>>> make_matrix(3, 5)
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> make_matrix(4, 2)
[[0, 0], [0, 0], [0, 0], [0, 0]]
>>> m = make_matrix(4, 2)
>>> m[1][1] = 7
>>> m
[[0, 0], [0, 7], [0, 0], [0, 0]]
"""
matrix = []
for row in range(rows):
matrix += [[0] * columns]
return matrix
make_matrix 的第一个版本失败(如书中 9.8 中所述)的原因是
...每一行都是其他行的别名...
不知道为什么
[[0] * columns] * rows
导致...每一行都是其他行的别名...
但不是
[[0] * columns]
即为什么一行中的每个[0] 都不是其他行元素的别名。
【问题讨论】:
标签: python list multiplication shallow-copy python-datamodel