在python中使用“ *”用不同的ADT对象实例填充列表

时间:2019-03-10 16:38:13

标签: python

我正在尝试创建一个包含另一个ADT实例的列表式ADT。 在其他情况下,我一直在使用“无”,但是在这种情况下,“无”检查没有任何用处,因此我尝试不使用它。

myList = [MyAdt()] * 10

因此,基本上,它是创建此实例并将其乘以10倍。关于如何进行调整以便创建新实例的任何想法?

**如果您愿意,我会给您提供ADT,但我认为它们无关紧要。 **

3 个答案:

答案 0 :(得分:0)

可以使用以下方法来创建包含MyAdt的10个实例的列表,而不是创建10个指向一个实例的变量:

myList = [MyAdt() for i in range(10)]

答案 1 :(得分:0)

您想要类似的东西

my_list = [MyAdt() for _ in range(10)]

MyAdt()创建10个my_list的不同实例。


顺便说一句,尽管对列表的每个元素都使用了相同的引用,但是您的原始代码仍然是O( n )。使用单个*操作对其进行写入的事实并不会改变这一点;在这种情况下,*本身不是O(1)运算。它的操作数是listint,使其与两个操作数均为数字类型时所求值的函数完全不同。

答案 2 :(得分:0)

我不知道O(1)对您意味着什么,但是如果它对我来说意味着相同,则与要构建的ADTs实例数量相比,它意味着常量。如果那是正确的,那那是不可能的。根据定义,您的“复杂性”在Theta(n)中。

现在如何正确实例化是另一个问题,但这是一个可能的答案:

class MyAdt:
  count = 0
  def __init__(self):
    self.a = MyAdt.count
    MyAdt.count += 1
  def __repr__(self):
    return str(self.a)

lists_size = 10

myList = [MyAdt()] * lists_size
print(myList)

myList = [MyAdt() for _ in range(lists_size)]
print(myList)

哪些印刷品:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  # 10 refs to the same instance
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 10 distinct instances

请注意,第二个列表的第一个项目打印“ 1”,因为它是我们创建的第二个实例,而不是第一个。