Python 为什么我的函数会改变参数,即使我把它写成纯函数?
此函数为列表中的每个项目添加一个零Python 为什么我的函数会改变参数,即使我把它写成纯函数?,python,python-2.7,Python,Python 2.7,此函数为列表中的每个项目添加一个零 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]] >
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]]
"""
new_list=matrix[:]
for i in range(len(new_list)):
new_list[i].append(0)
return new_list
它改变了我传递给它的参数,而不是创建一个新的对象。
我怎样才能达到预期的效果
>>> n = [[3, 2], [5, 1], [4, 7]]
>>> g = add_column(n)
期望值:
>>> print n
[[3, 2], [5, 1], [4, 7]]
>>> print g
[[3, 2, 0], [5, 1, 0], [4, 7, 0]]
>>> print n
[[3, 2, 0], [5, 1, 0], [4, 7, 0]]
>>> print g
[[3, 2, 0], [5, 1, 0], [4, 7, 0]]
实际结果:
>>> print n
[[3, 2], [5, 1], [4, 7]]
>>> print g
[[3, 2, 0], [5, 1, 0], [4, 7, 0]]
>>> print n
[[3, 2, 0], [5, 1, 0], [4, 7, 0]]
>>> print g
[[3, 2, 0], [5, 1, 0], [4, 7, 0]]
[:]
只创建列表的浅表副本。您需要使用并创建深度副本:
from copy import deepcopy
def add_column(matrix):
...
new_list=deepcopy(matrix)
有关更多信息,请参阅上的这篇Wikipedia文章。您试图通过使用
new\u list=matrix[:]
复制矩阵来实现纯函数。但是,这只是一个浅拷贝,因此每个子列表仍然是原始矩阵中对应子列表的引用。避免这种情况的一种方法是将行new\u list[i].append(0)
替换为new\u list[i]=new\u list[i]+[0]
,这将生成内部列表的副本
但是,通过列表理解可以更简单地解决此问题,它将自动创建一个新列表:
def add_column(matrix):
return [sublist+[0] for sublist in matrix]
请正确格式化您的代码。您应该四处搜索。老实说,这个列表行为是Python标签上最常见的问题之一,在我能想到的每一个Python教程中都有讨论。我不太清楚如何表达我的问题以找到答案。但我已经注意到了。谢谢你的帮助!