我有 2 个清单:
a = [1, 2, 3, 4, 5]
b = [9, 8, 7]
我执行了以下两个操作并尝试打印每个列表
a.append(b)
b.append(a)
print(a) # Expected Result: [1, 2, 3, 4, 5, [9, 8, 7]]
print(b) # Expected Result: [9, 8, 7, [1, 2, 3, 4, 5]]
但结果却是:
a = [1, 2, 3, 4, 5, [9, 8, 7, [...]]]
b = [9, 8, 7, [1, 2, 3, 4, 5, [...]]]
有人可以详细解释一下这里到底发生了什么吗?
我尝试打印列表中的每个元素,但列表一直持续下去,没有尽头。
Python 列表通过引用存储。您将此类引用添加到列表中,可以在其他位置“仍然”修改该列表。 a.append(b)
之后,你就得到了
[1, 2, 3, 4, 5, b]
。 b 目前具有值 [9,8,7]
,但是当您
b.append(a)
时,您将其值更改为 [9, 8, 7, a]
。并且
a
恰好包含
b
,依此类推,最终形成两个列表相互包含的循环。如果您想避免这种情况,您需要制作要附加的列表的copy
。副本将做到这一点,因此对原始列表的更改不会反映在副本中。
a = [1,2,3,4,5]
b = [9,8,7]
a_copy = a.copy()
b_copy = b.copy()
a.append(b_copy)
b.append(a_copy)
print(a) # Expected Result: [1,2,3,4,5,[9,8,7]]
print(b) # Expected Result: [9, 8, 7 ,[1,2,3,4,5]]
发生这种情况是因为当您将一个列表附加到另一个列表时,您并不是创建列表的副本,而是添加对原始列表的引用。这意味着如果您修改原始列表,更改也会反映在附加列表中,反之亦然。a
b
的引用,列表
b
包含对列表
a
的引用。这就是为什么当您打印列表时,您会看到嵌套列表
如果您尝试使用
a.copy()
和 b.copy()
那么您将获得所需的输出。您还可以同时扩展两个列表
a, b = a + [b], b + [a]
# [1, 2, 3, 4, 5, [9, 8, 7]]
# [9, 8, 7, [1, 2, 3, 4, 5]]
您的预期结果不会完全像您提到的那样,因为append()方法会将整个列表b作为元素添加到列表a,反之亦然。这将创建嵌套列表。如果您想要指定的预期结果,可以使用extend()方法将列表b的元素追加到列表a,反之亦然。以下是如何达到预期结果:
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
a.extend(b) # Appends elements of b to a
b.append(a) # Appends list a as a single element to b
print(a) # Output: [1, 2, 3, 4, 5, 6, 7, 8]
print(b) # Output: [5, 6, 7, 8, [1, 2, 3, 4, 5, 6, 7, 8]]
通过这些修改,您将获得列表 a 和 b 的预期结果。