繁体   English   中英

Python 在我们使用列表推导时并行创建对象

[英]Python creates objects in parallel when we use list comprehension

在 Python 中编写一些简单的面向对象的东西时,我碰巧遇到了这个问题。 假设我创建了一个带有增量 ID 的 class(使用 static 变量),并初始化了该 class 的新对象,期望每个新实例的 ID 自动增加 1。

这是我定义的 class :

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 可能不是你想要的。 它只创建一个 object,然后创建一个列表“指向”k 次指向同一个 object。

使用以下命令可视化 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])

将显示差异

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM