程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

python的列表:[1,2,3]与[1,2,3].copy()的区别?

hfteth 2025-03-26 12:30:48 技术文章 11 ℃

在使用python的列表时,必须要认识到列表引用与列表副本的区别,否则,很容易导致结果出错。首先,让我们来看看下面的2个例子的情况。

a = [1, 2, 3]
b = [4, 5]
a.append(b)
b.extend([6])
print(a)

上面的输出结果是[1, 2, 3, [4, 5, 6]],不是我们认为的[1, 2, 3, [4, 5]]。这是因为:使用 a.append(b) 将列表 b 作为一个元素添加到列表 a 中。此时,a 变为 [1, 2, 3, [4, 5]]。注意,这里 a 的最后一个元素是指向 b 的引用

然后,使用 b.extend([6]) 将元素 6 添加到列表 b 中。因为之前 a 的最后一个元素是对 b 的引用,所以这个改变也会影响到 a 的内容。因此,b 变为 [4, 5, 6],同时 a 最后一个元素也随之更新为 [4, 5, 6]。最后,输出列表 a,得到的结果是 [1, 2, 3, [4, 5, 6]]。

这种情况下,对 b 的任何修改都会反映在 a 中,因为它包含的是 b 列表的引用而不是其副本。

那么,我们再看看下面的例子:

a = [1, 2, 3]
b = [4, 5]
a.append(b.copy())
b.extend([6])
print(a)

这里的输出结果是[1, 2, 3, [4, 5]],不是[1, 2, 3, [4, 5, 6]]。这是因为:列表a中的最后一个元素是列表b的一个副本,不是列表b的引用。所以,后面b的改变不会影响到列表a的最后一个元素,此时最后一个元素只是一个拷贝或副本(与列表b的内容一样但存储空间地址不一样),不再指向列表b的存储空间地址,所以列表b的存储空间的内容的变化不再影响列表a的最后一个元素。

上面的情况,与下面这个例子也是同样的道理:

lb = [1,2]
def fm(lt):
    lt.append(3)
fm(lb)
print(lb)

输出结果是[1,2,3],不是[1,2]。这是因为:

函数fm()将lb作为参数传递时,传递的是lb的引用或者说是存储空间的地址,函数fm的形参lt接收的是lb的引用或地址,然后lt新增一个值,就是lt指向的地址内容新增1个值,而lt指向的引用或地址就是lb,也就是lb和lt都是指向同一个引用或同一个地址,lt的变化也就是lb的变化。

示意图如下所示:

Tags:

最近发表
标签列表