「コンピューター科学者のように考える方法: Python 2nd Edition で学習する」ドキュメントを読んでいます。第 9 章の最後に演習 11 があり、doctest に合格するための Python コードを書くよう求められます。
私の最初の解決策:
def add_column(matrix):
"""
>>> m = [[0, 0], [0, 0]]
>>> add_column(m)
[[0, 0, 0], [0, 0, 0]]
>>> n = [[3, 2], [5, 1], [4, 7]]
>>> add_column(n)
[[3, 2, 0], [5, 1, 0], [4, 7, 0]]
>>> n
[[3, 2], [5, 1], [4, 7]]
"""
result = matrix[:]
for index in range(len(matrix)):
result[index] += [0]
return result
if __name__ == "__main__":
import doctest
doctest.testmod()
ただし、このコードは 2 番目のテストに合格しませんでした。forループの本体を次のように変更しました。
result[index] = result[index] + [0]
コードはすべてのテストに合格します。しかし、このコードの変更がどのように問題を解決したのか理解できません。result[index] = result[index] + [0]
の明示的な形式だと思ったresult[0] += [0]
のに、なぜ動作が異なるのですか?
私の答えをソリューションで提供されているコードと比較したところ、問題はリストのクローンを作成した方法にあると思われます。ソリューションでは、次のように行われます: result = [d[:] for d in matrix]
、この場合、最初のforループが機能します。しかし、なぜ機能しresult = matrix[:]
ないのですか?新しいオブジェクトではなく、エイリアスを作成していますか?
また、誰かがどのよう[d[:] for d in matrix]
に解析され、そのような構文がいつ使用されるかを説明できますか? forループをこのように使用する方法は見たことがなく、レッスンでも説明/実演されていません。