我在用 Python 编写一些简单的面向对象的东西时碰巧遇到了这个问题。假设我创建了一个具有增量 ID 的类(使用静态变量),并初始化了该类的新对象,期望每个新实例的 ID 自动增加 1。
这是我定义的类:
class Object:
counter = 0
def __init__(self):
self.id = Object.counter
Object.counter += 1
然后,我创建了一个固定长度的数组,其中包含 k 个 Object
类型的实例。我有两种方法可以做到这一点:
(1)
objects = [Object() for i in range(k)]
或 (2)
objects = [Objects()] * k
(1) 给出了我想要的结果,即每个实例都有一个增量 ID。有趣的是,(2) 生成的实例都具有相同的 ID = 0。所以我猜 (2) 与 (1) 做同样的事情,但是是并行的?
另外,我主要是用Java做OOP,这就是我实现增量ID的方式。我不知道这是否也适用于 Python。
如果我的问题是多余的,我很抱歉。我真的不知道如何称呼我正在做的这种事情(我猜是列表理解)。
非常感谢您的回复!
最佳答案
1 是正确的做法。它创建 k 个对象。
2 可能不是您想要的。它仅创建一个对象,然后创建一个“指向”同一对象 k 次的列表。
使用以下命令可视化 1 和 2 的结果
print(list(id(obj) for obj in objects))
许多人在第一次尝试实现二维数组时经常会遇到这种错误(如 2)。对于棋盘。
board = [[0] * 8] * 8
它创建一行零,被引用 8 次。
要输入 8 个不同的行
board = [([0] * 8) for row in range(8)]
print([id(row) for row in board])
会显示差异
关于当我们使用列表理解时,Python 会并行创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58692535/