将值从一个列表复制到另一个列表而不更改python

时间:2016-01-16 17:37:14

标签: 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(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]]

是的,我知道这不是一个做<whatever I want to do>的好方法,我只是出于好奇而不是必需。

3 个答案:

答案 0 :(得分:3)

您可以执行slice assignment

>>> 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]

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

要使用其他列表(或任意可迭代)覆盖列表的内容,可以使用切片分配语法:

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__),只是项目索引现在是slice对象,它表示要覆盖的项目范围。基于此示例,您甚至可以在自己的类型中支持切片分配。