gpt4 book ai didi

Python - 如何检查/发现列表有引用?

转载 作者:行者123 更新时间:2023-12-01 01:22:30 25 4
gpt4 key购买 nike

Python 中更令人困惑的方面之一是实例化列表列表(假设不使用 numpy) - 例如,如果尝试通过更简单的乘法来完成此操作,您最终会得到引用副本:

In [1]: a = [[0] * 4] * 4
In [2]: a
Out[2]: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

In [3]: a[0][1] = 1
In [4]: a
Out[4]: [[0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0]]

正如其他各种 SO 帖子中提到的,例如 this one ,在没有任何引用的情况下实例化的正确方法如下:

In [5]: b = [[0 for i in range(4)] for i in range(4)]
In [6]: b
Out[6]: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

In [7]: b[0][1] = 1
In [8]: b
Out[8]: [[0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

问题是这样的 - 假设一个人确实像列表 a 一样定义了他们的列表,有没有一种方法可以检查数组以表明它正在使用引用?仅打印数组不会显示引用。

最佳答案

首先是一些术语:您在这里讨论的是列表(而不是数组),它总是存储对其元素的引用。

检查列表中的所有引用是否引用不同对象的快速方法是

>>> l1 = [[0, 1], [0, 1]]
>>> l2 = [[0, 1]]*2
>>>
>>> len(set(map(id, l1))) == len(l1) # no duplicates
True
>>> len(set(map(id, l2))) == len(l2) # duplicates
False

它只是检查长度为 n 的列表中的对象是否有 n 个唯一 ID。

如果您的列表包含大量元素,则延迟执行此操作并在第一个重复 ID 上返回 False 可能会更有效。

def all_unique(lst):
seen = set()
for x in lst:
id_ = id(x)
if id_ in seen:
return False
seen.add(id_)
return True

...工作方式如下:

>>> all_unique(l1)
True
>>> all_unique(l2)
False

关于Python - 如何检查/发现列表有引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53687500/

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