我正在阅读“如何像计算机科学家一样思考:使用 Python 第 2 版文档学习”。在第 9 章的最后有这个练习 11,它要求你编写 Python 代码以使 doctest 通过。
我最初的解决方案:
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()
然而,这段代码没有通过第二次测试。我将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循环的方式,也没有在课程中解释/演示过。