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

Python 如何修改作为可变长度参数传递的列表的内容?,python,performance,syntax,Python,Performance,Syntax,我认为可变长度参数在进入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 th

我认为可变长度参数在进入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\u list(*x)
解压列表

def编辑列表(我的列表):
我的清单[1]=2
def main():
x=[…]
编辑列表(x)
打印(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

您将从
编辑列表
返回一个列表,但忽略其返回值。当您通过
*x
传递时,您基本上是解包列表并发送其值,而不是列表对象本身。这是否意味着无法编辑传递到可变长度参数中的值?您可以编辑对象本身,但不能更改原始容器。本质上,原始实现中的
edit_list
不知道
*args
中的元素曾经是另一个列表的一部分(
x