【发布时间】:2012-08-12 10:40:02
【问题描述】:
我正在阅读“如何像计算机科学家一样思考:使用 Python 第 2 版文档学习”。在Chapter 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 循环的方式,并且在课程中也没有解释/演示过。
【问题讨论】:
标签: list for-loop python-2.7 clone