【发布时间】:2012-08-13 04:46:26
【问题描述】:
新手有问题,所以请温柔:
list = [1, 2, 3, 4, 5]
list2 = list
def fxn(list,list2):
for number in list:
print(number)
print(list)
list2.remove(number)
print("after remove list is ", list, " and list 2 is ", list2)
return list, list2
list, list2 = fxn(list, list2)
print("after fxn list is ", list)
print("after fxn list2 is ", list2)
这会导致:
1
[1, 2, 3, 4, 5]
after remove list is [2, 3, 4, 5] and list 2 is [2, 3, 4, 5]
3
[2, 3, 4, 5]
after remove list is [2, 4, 5] and list 2 is [2, 4, 5]
5
[2, 4, 5]
after remove list is [2, 4] and list 2 is [2, 4]
after fxn list is [2, 4]
after fxn list2 is [2, 4]
当我只做list2.remove() 而不是list.remove() 时,我不明白为什么列表会发生变化。我什至不确定要使用什么搜索词来弄清楚。
【问题讨论】:
-
几年前,当我不断地从 scheme/lisp 切换到 python 时,这种情况一直发生在我身上。在我看来,不可变的列表对象更容易理解。
-
欢迎来到 SO!如果以下任何答案向您展示了问题的解决方案,请不要忘记接受答案。 (您可以通过单击旁边的小复选标记来接受答案)。
-
@AdamGent:这是一个很好的观点。如果您可以编写代码来构建新列表而不是改变它们,那么别名永远不会成为问题。而且您可以使用元组而不是列表来确保您不会意外地发生变异。这并不总是正确的答案(或者因为 Python 列表/元组作为有效数组的效率特性,或者因为转换为不可变算法并不明显并且您的时间有限),但始终值得牢记.
-
@abarnert 你完全正确。 Lisp/Scheme 的特殊之处在于,不可变列表实现(cons 单元)非常快速且具有内存智能。这有点类似于 Java 和 Python 处理字符串的方式。我曾经尝试在 CMUCL 中为数组切换列表,认为这会提高性能,但我几乎没有得到任何提升。对于可变列表通常更快的 Java、Scala 或 Python 而言,情况并非如此。
-
@user1604149 请点击检查按钮接受答案