将两个列表相互附加会产生包含“[...]”的意外结果

问题描述 投票:0回答:4

我有 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 list append recursive-datastructures
4个回答
1
投票

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]]

发生这种情况是因为当您将一个列表附加到另一个列表时,您并不是创建列表的副本,而是添加对原始列表的引用。这意味着如果您修改原始列表,更改也会反映在附加列表中,反之亦然。

1
投票
您创建一个循环引用,其中列表

a

包含对列表

b

 的引用,列表 
b
 包含对列表 
a
 的引用。这就是为什么当您打印列表时,您会看到嵌套列表
如果您尝试使用 
a.copy()

b.copy()

 那么您将获得所需的输出。

您还可以同时扩展两个列表

0
投票
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,反之亦然。以下是如何达到预期结果:

-3
投票
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 的预期结果。
    

© www.soinside.com 2019 - 2024. All rights reserved.