gpt4 book ai didi

python - 将列表分配给Python列表列表中的另一个列表

转载 作者:太空宇宙 更新时间:2023-11-04 05:52:31 27 4
gpt4 key购买 nike

如果你有如下列表列表:

>> A = [[1], [2]]

然后假设您通过以下方式将第二个列表分配给第一个列表:

>> A[0] = A[1]

你最终得到以下结果:

>> print A
[[2], [2]]

所以 A[0] 和 A[1] 现在指向同一个列表。如果您通过以下方式将元素附加到第一个元素:

>> A[0].append(3)

您将获得以下内容:

>> print A
[[2,3], [2,3]]

但是,如果您尝试通过以下方式删除第一个列表:

>> del A[0]

然后只去掉一个列表,如下:

>> print A
[[1,2]]

Q1.1:行为为何不同?人们可能希望这两个列表都被删除。

显然,如果只想复制 A[1],那么以下方法可以正常工作:

>> A = [[1], [2]]
>> A[0] = list(A[1])
>> print A
[[2], [2]]
>> A[0].append(3)
>> print A
[[2,3], [2]]

问题在于它的运行时间与要复制的列表的大小成线性关系,即 A[1]。

Q1.2:一个人可以在没有线性时间复制操作的情况下从另一个人那里复制一个列表吗?

最佳答案

Q1.1

您必须区分对象和对象标识。标识只是对象存储单元的逻辑地址。当您执行 A[0] = A[1] 时,实际上并没有复制对象,而是获得了对象的新标识。在 A[0] = A[1] 之后,您有两个身份 A[0]A[1] 到同一个对象,所以当你执行 A[0].append(...)A[1].append(.) 时,实际上是什么受影响的是同一个对象。

现在关于列表。 Python 中的列表不包含对象。他们持有对象的身份。你可以通过比较来检查这一点

sys.getsizeof([1])sys.getsizeof([1000000000000000000000000000000]),

尽管 10000000000000000000000000000000 明显比 1 重,但它们的大小相同。

del 所做的是,它从列表中删除一个元素,该元素恰好是两个 identities 之一而不是对象,所以当您有一个列表时拥有同一对象的两个身份,del 其中一个,您仍然保留该对象和另一个身份因为该对象仍被引用

Q1.2

如果你想复制,你可以做 A[0] = A[1][:],这会将 A[0] 分配给一个切片.它应该更快。检查this .

关于python - 将列表分配给Python列表列表中的另一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29427131/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com