在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>
的好方法,我只是出于好奇而不是必需。
答案 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
对象,它表示要覆盖的项目范围。基于此示例,您甚至可以在自己的类型中支持切片分配。