将值从一个列表复制到另一个列表,而不改变python中的引用

将值从一个列表复制到另一个列表,而不改变python中的引用,python,Python,在python中,列表等对象是通过引用传递的。使用=运算符赋值通过引用赋值。所以这个函数: def modify_list(A): A = [1,2,3,4] 获取对列表的引用并将其标记为a,但随后将局部变量a设置为新引用;调用作用域传递的列表未修改 test = [] modify_list(test) print(test) 打印[] 但是,我可以这样做: def modify_list(A): A += [1,2,3,4] test = [] modify_list(

在python中,列表等对象是通过引用传递的。使用=运算符赋值通过引用赋值。所以这个函数:

def modify_list(A):
    A = [1,2,3,4]
获取对列表的引用并将其标记为a,但随后将局部变量a设置为新引用;调用作用域传递的列表未修改

test = []
modify_list(test)
print(test)
打印[]

但是,我可以这样做:

def modify_list(A):
    A += [1,2,3,4]

test = []
modify_list(test)
print(test)
印刷品[1,2,3,4]

如何分配通过引用传递的列表以包含另一个列表的值?我所寻找的功能等同于以下内容,但更简单:

def modify_list(A):
    list_values = [1,2,3,4]
    for i in range(min(len(A), len(list_values))):
        A[i] = list_values[i]

    for i in range(len(list_values), len(A)):
        del A[i]

    for i in range(len(A), len(list_values)):
        A += [list_values[i]]

是的,我知道这不是一个好的方法,我只是出于好奇而不是出于必要而问。

最简单的解决方案是使用:

def modify_list(A):
    A[::] = [1, 2, 3, 4]

要用另一个列表或任意iterable覆盖列表的内容,可以使用切片分配语法:

A = B = [1,2,3]
A[:] = [4,5,6,7]
print(A)          # [4,5,6,7]
print(A is B)     # True
切片分配是在大多数可变的内置类型上实现的。上述任务与以下任务基本相同:

A.__setitem__(slice(None, None, None), [4,5,6,7])
因此,当常规项目分配发生时,调用相同的神奇函数_setitem _uuu,只是项目索引现在是一个切片对象,它表示要覆盖的项目范围。基于此示例,您甚至可以在自己的类型中支持切片分配。

您可以执行以下操作:

>>> def mod_list(A, new_A):
...    A[:]=new_A
... 
>>> liA=[1,2,3]
>>> new=[3,4,5,6,7]
>>> mod_list(liA, new)
>>> liA
[3, 4, 5, 6, 7]