我正在研究 Udacity,Dave Evans 介绍了一个关于列表属性的练习
list1 = [1,2,3,4]
list2 = [1,2,3,4]
list1=list1+[6]
print(list1)
list2.append(6)
print(list2)
list1 = [1,2,3,4]
list2 = [1,2,3,4]
def proc(mylist):
mylist = mylist + [6]
def proc2(mylist):
mylist.append(6)
# Can you explain the results given by the four print statements below? Remove
# the hashes # and run the code to check.
print (list1)
proc(list1)
print (list1)
print (list2)
proc2(list2)
print (list2)
输出是
[1, 2, 3, 4, 6]
[1, 2, 3, 4, 6]
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4, 6]
所以在函数中,向集合中添加 6 不会显示,但在不在函数中时会显示?
最佳答案
So in a function the adding a 6 to the set doesn't show but it does when not in a function?
不,事实并非如此。
发生的事情是,当您执行 mylist = mylist + [6]
时,您实际上是在创建一个全新的列表并将其放入本地 mylist
变量中。此 mylist
变量将在函数执行后消失,新创建的列表也将消失。
OTOH 当您执行 mylist.append(6)
时,您不会创建新列表。您已在 mylist
变量中获得该列表,并将新元素添加到同一列表中。结果是列表(也由 list2
指向)将自行更改。 mylist
变量将再次消失,但在这种情况下,您更改了原始列表。
让我们看看更直观的解释是否可以帮助您:)
调用 proc()
时会发生什么
当您编写 list1 = [1, 2, 3, 4, 5]
时,您正在创建一个新的列表对象(在等号的右侧)并创建一个新变量,list1
,它将指向这个对象。
然后,当您调用 proc()
时,您创建了另一个新变量 mylist
,并且由于您将 list1
作为参数传递,mylist
将指向同一个对象:
但是,操作mylist + [6]
创建了一个全新的列表对象,其内容是mylist
指向的对象的内容加上以下列表对象的内容 - 即 [6]
。由于您将这个新对象归因于 mylist
,我们的场景发生了一些变化,mylist
不再指向 list1
指向的同一个对象:
我没有说的是 mylist
是一个局部变量:它会在 proc()
函数结束后消失。所以,当 proc()
执行结束时,mylist
就消失了:
由于没有其他变量指向由 mylist + [6]
生成的对象,它也会消失(因为垃圾收集器*将收集它):
注意,最后list1
指向的对象并没有改变。
调用 proc2()
时会发生什么
当您调用 proc2()
时,一切都会改变。首先,它是同一件事:您创建一个列表...
...并将其作为参数传递给一个函数,该函数将生成一个局部变量:
但是,您不是使用生成新列表的 +
连接运算符,而是将 append()
方法应用于现有列表。 append()
方法不会创建新对象;相反,它_changes 现有的:
函数结束后,局部变量会消失,但它和list1
指向的原始对象已经改变:
由于它仍然被list1
指向,所以原始列表没有被破坏。
编辑:如果您想看看在您眼前发生的所有这些事情,请转到this radically amazing simulator。 :
* 如果您不知道什么是垃圾收集器...好吧,理解您自己的问题后您很快就会发现。
关于python - 为什么 + 运算符不更改列表而 .append() 会更改列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10748158/