如何修改作为可变长度参数传递的列表的内容



我认为可变长度参数在进入edit_list函数时会变成元组,所以我将其从元组更改为列表来编辑它。当它返回时,我认为它仍然被视为元组,因此不能返回参数值的更改?

如果是,我该如何编辑可变长度参数上下文中使用的列表的内容?

def main():
x = ['hi','hello','world',1,2]
edit_list(*x)
print(x)
#why can't I change the list index 1 value to '2' and then
#return the modified arg list to main and then print it out?
def edit_list(*args):
args = list(args)
print(args)
args[1] = 2
return args
if __name__ == '__main__' : main()

您需要直接传入列表,而不是使用edit_list(*x)拆包列表。

def edit_list(my_list):
my_list[1] = 2
def main():
x = [ ... ]
edit_list(x)
print(x)

要理解其机制,您应该尝试熟悉概念"可变的";以及";不可变";。(当然,只有当你想在Python方面做得更好的时候(。

以您的代码为例,如果您传入的元素是一个列表,并且您正在更改该列表的元素,则会得到不同的结果。

def main():
x = ['hi',['hello'],'world',1,2]
edit_list(*x)
print(x)
# After you run edit_list, the original x will be changed
def edit_list(*args):
args = list(args)
print(args)
args[1][0] = 2
return args

在python中,对象要么是"可变的";或";不可变";。例如,列表是可变的。整数,字符串是不可变的。当你将可变对象传递给函数时,你会传递它的引用,所以当你编辑它(而不是将另一个对象分配给变量(时,你将编辑原始对象。但是,如果它是不可变的,当您将对象传递给函数时,它将生成一个副本。

也可以使用您的代码作为示例。你正在有效地进行

edit_list("hi", "hello", "world", 1, 2)

所有的参数都是不可变的,所以您复制了它们中的每一个并将它们提供给函数。因此,当您在函数内部时,您已经拥有了与原始对象不同的对象。您无法更改原始列表。

但是,如果您将它们作为列表传入

edit_list(x)

因为x是一个可变对象,所以您可以在函数中传递引用或原始对象。因此,当您编辑列表lst[1] = 2时,原始列表将发生更改。但是,如果执行类似lst = [1, 2, 3]的操作,则不会更改原始x,因为您只是创建了另一个对象并将其分配给不相关的变量lst

最新更新