我在閱讀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]
不是其他行元素的別名。
aha,難道這不像一個大小爲1的特殊行爲類型。 我聽說「Pythonista」不喜歡特殊情況(正如Python中的Zen所解釋的那樣)...特殊情況下aren沒有足夠的特殊性來打破規則......「)。 – fizzbuzz 2009-06-10 11:23:48
誤導。 python中沒有「原始」這樣的東西。一切都是一個對象,並且始終通過引用傳遞,包括INTEGERS。事實上,變量只是名稱引用。這裏的問題是列表是可變的,而整數不是。 – nosklo 2009-06-10 11:32:03