【发布时间】:2019-04-16 07:42:53
【问题描述】:
list[:]
通过浅拷贝创建一个新列表。我进行了以下实验:
>>> squares = [1, 4, 9, 16, 25]
>>> new_squares = square[:]
>>> squares is new_squares
False
>>> squares[0] is new_squares[0]
True
>>> id(squares)
4468706952
>>> id(new_squares)
4468425032
>>> id(squares[0])
4466081856
>>> id(new_squares[0])
4466081856
这里的一切看起来都不错! new_square 和 square 是不同的对象(这里列出),但由于浅拷贝,它们共享相同的内容。但是,下面的结果让我很困惑:
>>> new_squares[0] = 0
>>> new_squares
[0, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]
我更新了 new_square[0] 但 square 不受影响。我检查了他们的身份证:
>>> id(new_squares[0])
4466081824
>>> id(squares[0])
4466081856
可以发现 squares[0] 的 id 没有变化,但是 new_squares[0] 的 id 发生了变化。这和我之前理解的浅拷贝有很大的不同。
谁能解释一下?谢谢!
【问题讨论】:
-
它是浅的,不是零深度的。如果更新一个变量会改变另一个变量,那么它们根本就不会是副本。
-
整数是不可变的。试试
squares = [[1], 4, 9, 16, 25]; new_squares = squares[:]; new_squares[0].append(2); print(squares[0])