nums = []
vals = nums
vals.append(1)
结果显示 nums 和 val 的长度相同,但
nums = []
vals = nums[:]
vals.append(1)
这表明 VAL 比 NUM 长
与:
nums = []
vals = nums
vals.append(1)
您有 2 个引用指向内存中的同一列表。
跟:
nums = []
vals = nums[:]
vals.append(1)
内存中有 2 个不同的列表:vals
是nums
列表的副本(为空)。
写入vals = nums[:]
与写入vals = list(nums)
相同:您创建一个新列表(其中包含相同的项目)。
nums = []
vals = nums[:]
vals.append(1)
在第二种情况下,您将从数字创建新的列表值。这两个列表都将指出单独的内存位置,因此对 vals 列表所做的更改不会对 nums 列表产生任何影响。
nums = []
vals = nums
vals.append(1)
而在第一种情况下,您将列表编号复制到 val,并且 val 和 num 都指向相同的堆存储位置。 因此,对 vals 所做的更改将自动影响 nums。
有关更多信息,您可以阅读文章- https://docs.python.org/3/library/copy.html
使用[:]
创建一个包含与nums
相同的值的新list
,但该新list
与nums
的对象不同。这就是为什么在你的第二个例子中vales
比nums
长:它不是同一个对象。
initial = []
a = initial
b = initial[:]
assert a is initial
assert b is not initial
更准确地说,如文档中所述,使用[:]
编制索引等效于copy
列表:
initial = []
# these are equivalent
a = initial[:]
b = initial.copy()
assert a is not initial
assert b is not initial