看看下面的代码
testList = ["This", "Is", "A", "Test"]
dummyList = testList
dummyList = dummyList + ["Hello"]
我期望testList的内容被更改,因为dummyList引用了testList,我们只是添加了一个新元素,但这没有发生。现在看下面的代码。
testList = ["This", "Is", "A", "Test"]
dummyList = testList
dummyList[0] = 'Hello'
在此代码中,testList确实发生了更改。为什么对dummyList的更改会在第二个代码块而不是第一个代码块中更改testList的内容?
答案 0 :(得分:6)
通过使用=
运算符,您使testList
指向与dummyList
相同的内存地址,因此它们实际上是同一对象。可以使用is
进行验证:
testList = ["This", "Is", "A", "Test"]
dummyList = testList
>>> testList is dummyList
True
但是当您重新分配它时,它会创建一个新列表,现在不再指向同一对象:
dummyList = dummyList + ['hello']
>>> testList is dummyList
False
但是,通过进行适当的更改(例如使用dummyList[0] = 'Hello'
),则只需更改dummyList
,它仍然指向与{{1} }。区别在于没有新任务。
您可以创建一个副本来完全避免这种情况:
testList
答案 1 :(得分:5)
在第一个示例中,您不编辑列表,仅构造了一个 new 列表,并将该 new 列表存储在{ {1}}变量。但是旧列表从未改变。
在第二个示例中,您编辑该列表。由于function resize(array, i, j) {
var gen = array.reduce((a, b) => a.concat(b))[Symbol.iterator]();
return Array.from({ length: i }, _ => Array.from({ length: j }, _ => gen.next().value));
}
console.log(resize([[0, 1, 2, 3, 4, 5]], 2, 3));
和dummyList
引用了 same 列表,因此两个变量的确显示了以dummyList
作为第一个元素的列表。
您可以通过使用testList
添加元素来编辑列表:
'Hello'