将值从一个列表复制到另一个列表,而不改变python中的引用
在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(
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]