Python 如何在不修改源的情况下在函数中追加/前置列表?

Python 如何在不修改源的情况下在函数中追加/前置列表?,python,python-3.x,list,defensive-copy,Python,Python 3.x,List,Defensive Copy,鉴于这一来源清单: source_list = [2, 3, 4] 这个功能是: def function(list_in): list_in.append(5) list_in.insert(0, 1) return list_in def function(list_n): #Do a copy of your list list_in = list_n.copy() list_in.append(5) list_in.ins

鉴于这一来源清单:

source_list = [2, 3, 4]
这个功能是:

def function(list_in):
    list_in.append(5)
    list_in.insert(0, 1)
    return list_in
   def function(list_n):
    #Do a copy of your list
    list_in = list_n.copy()
    list_in.append(5)
    list_in.insert(0, 1)
    return list_in
正如所料,我得到:

>>> function(source_list)
[1, 2, 3, 4, 5]
但如果我在函数外调用变量source_list,我仍然会得到:

>>> source_list
[1, 2, 3, 4, 5]

是否有另一种方法可以修改函数中列表的附加/前置,从而不更改原始列表?

如果您有权访问该函数,则可以复制传递的列表:

像这样:

def function(list_in_):     # notice the underscore suffix
    list_in = list_in_[:]   # copy the arg into a new list
    list_in.append(5)
    list_in.insert(0, 1)
    return list_in          # return the new list

否则,您可以使用源列表的副本调用该函数,并决定是否需要新列表,或者是否希望源列表发生变化,如@tdelaney所示。如果您有权访问该函数,则可以复制传递的列表:

像这样:

def function(list_in_):     # notice the underscore suffix
    list_in = list_in_[:]   # copy the arg into a new list
    list_in.append(5)
    list_in.insert(0, 1)
    return list_in          # return the new list

否则,您可以使用源列表的副本调用该函数,并决定是否需要新列表,或者是否希望源列表发生变化,如@tdelaney所示。如果您是该函数的调用方,则可以先复制

new_list = function(source_list[:])

这样做的好处是,调用者可以决定是否要修改其当前列表。

如果您是函数的调用者,可以先复制

new_list = function(source_list[:])
这样做的好处是调用方可以决定是否要修改其当前列表。

您可以使用列表上的复制方法:

新建列表=函数源列表。复制 您可以使用列表上的复制方法:

新建列表=函数源列表。复制
仅在函数中添加一行:

def function(list_in):
    list_in.append(5)
    list_in.insert(0, 1)
    return list_in
   def function(list_n):
    #Do a copy of your list
    list_in = list_n.copy()
    list_in.append(5)
    list_in.insert(0, 1)
    return list_in

仅在函数中添加一行:

def function(list_in):
    list_in.append(5)
    list_in.insert(0, 1)
    return list_in
   def function(list_n):
    #Do a copy of your list
    list_in = list_n.copy()
    list_in.append(5)
    list_in.insert(0, 1)
    return list_in

试试这个。由于在代码中运行函数时修改了源代码列表,因此无法保留源代码列表

source_list = [2, 3, 4]
list_in=source_list.copy()
def function(list_in):
    list_in.append(5)
    list_in.insert(0, 1)
    return list_in
print(function(list_in))
print(source_list)

试试这个。由于在代码中运行函数时修改了源代码列表,因此无法保留源代码列表

source_list = [2, 3, 4]
list_in=source_list.copy()
def function(list_in):
    list_in.append(5)
    list_in.insert(0, 1)
    return list_in
print(function(list_in))
print(source_list)