为什么我的函数会改变参数,即使我把它写成纯函数?

-5 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]]
  >>> 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
Run Code Online (Sandbox Code Playgroud)

它正在改变我传递的参数,而不是创建它的新对象.我如何做到这一点,以便我得到预期的结果?

>>> n = [[3, 2], [5, 1], [4, 7]]
>>> g = add_column(n)
Run Code Online (Sandbox Code Playgroud)

预期:

>>> print n
[[3, 2], [5, 1], [4, 7]]

>>> print g
[[3, 2, 0], [5, 1, 0], [4, 7, 0]]
Run Code Online (Sandbox Code Playgroud)

实际结果:

>>> print n
[[3, 2, 0], [5, 1, 0], [4, 7, 0]]

>>> print g
[[3, 2, 0], [5, 1, 0], [4, 7, 0]]
Run Code Online (Sandbox Code Playgroud)

iCo*_*dez 5

[:]仅创建列表的浅表副本.您需要使用copy.deepcopy并创建深层副本:

from copy import deepcopy

def add_column(matrix):  
...
    new_list=deepcopy(matrix)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Wikipedia关于对象复制的文章.