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教程中都有讨论。我不太清楚如何表达我的问题以找到答案。但我已经注意到了。谢谢你的帮助!