为何用[:]复制列表无效?循环赋值可行的原因解析
问题解析:两种列表复制方式的差异
首先明确两种操作的本质区别:
prelist = postlist[:]:这是创建postlist的浅拷贝,然后把变量prelist的指向从原来的[0,0,0,0,0]列表,改成指向这个新的拷贝列表。原来的初始列表对象根本没被修改,只是prelist变量不再指向它了。如果你的代码里还有其他变量或逻辑引用着原来的初始列表,这些地方不会看到任何变化——因为你只是换了prelist这个变量的指向,没碰原列表。for i in range(5): prelist[i] = postlist[i]:这是直接操作原来的prelist列表对象,逐个替换它内部的元素值。原列表对象的引用没有变,只是里面的元素被更新了,所以所有引用这个列表的地方都会看到元素的变化。
你觉得第一种方式“无法正常运行”,本质是你期望修改原来的prelist列表元素,但第一种方式并没有修改原列表,只是让prelist变量指向了新列表。如果后续代码依赖的是原来的列表对象(比如其他地方保存了初始列表的引用),自然看不到预期结果。
举个直观的例子:
prelist = [0, 0, 0, 0, 0] another_ref = prelist # 保存原列表的引用 # 第一种方式测试 prelist = postlist[:] print(another_ref) # 输出还是 [0, 0, 0, 0, 0],原列表没被修改 # 重置后用第二种方式测试 prelist = [0, 0, 0, 0, 0] another_ref = prelist for i in range(5): prelist[i] = postlist[i] print(another_ref) # 输出 [50.0, 25.0, 12.5, 6.25, 3.125],原列表元素被修改
内容的提问来源于stack exchange,提问作者Emre Sagbas
相关产品推荐
相关产品推荐

