Possible Duplicate:
Python passing list as argument
我找了很多关于这个的话题,但我不明白到底发生了什么。在
我有这个代码:
def altera(L1, L2):
for elemento in L2:
L1.append(elemento)
L2 = L2 + [4]
L1[-1] = 10
del L2[0]
return L2[:]
Lista1 = [1,2,3]
Lista2 = [1,2,3]
Lista3 = altera(Lista1, Lista2)
print Lista1
print Lista2
print Lista3
结果是:
^{pr2}$我不明白Lista1
是如何被修改的,而{Lista1
和{
在Python中,列表是通过引用传递的。
Lista1
被修改,因为您直接调用.append
:由于未修改列表,
Lista2
未被修改。您使用了加法运算符L2 = L2 + [4]
,它不修改L2
。相反,它创建一个新列表并返回结果。在如果你用Google搜索术语“passbyreference”,你应该能够在Python中找到一些很好的解释性示例。在
当您执行
L1.append(elemento)
时,您正在调用一个方法,该方法实际上更改了由变量L1
命名的列表。其他所有设置L1
和L2
值的命令实际上只是为新变量创建新名称。在此版本不会更改任何内容:
而这一次:
^{pr2}$但是
L += [2]
有一个棘手的问题,它与L = L + 2
不完全相同。关于扩充赋值语句的Python Language Reference部分解释了这一区别:在您的功能中有两种不同的情况:
要扩展我添加的内联注释:
altera
内,变量L1
是您传入的任何内容(因此它是Lista1
)。它不是一个拷贝,一个具有相同内容的新列表-它引用了相同的实际对象当你分配
L2 = L2 + [4]
时,你要做两件事:L2 + [4]
创建一个新列表L2
指向这个新列表,而不是您传入的任何内容如果我们重新命名变量,它将变得显式,并且工作方式与完全相同:
^{pr2}$或者,如果您想在适当的地方修改原始的
L2
(即,实际修改Lista2
),您可以这样做注意最后一行仍然意味着
Lista3
将是Lista2
不同的列表对象,但它将具有相同的值。如果您只是return L2
,Lista3
将与L2
完全相同,因此它们将是同一列表对象的两个名称。如果您想防止这种行为,可以如下调用
altera
:现在,在}。在
altera
内部,它将处理自己的参数副本,并且不会影响原始的Lista1
和{相关问题 更多 >
编程相关推荐