【发布时间】:2018-12-08 22:16:06
【问题描述】:
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]]
正如this one 等其他各种 SO 帖子中所提到的,在没有任何引用的情况下进行实例化的正确方法如下:
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,有没有一种方法可以检查数组以显示它正在使用引用?仅仅打印数组不会显示引用。
【问题讨论】:
-
在这两种情况下都使用引用。对于 CPython,有
sys.getrefcount()可能表示有多少引用指向一个对象 -
python中的所有对象都有一个地址。