我正在尝试创建一个包含另一个ADT实例的列表式ADT。 在其他情况下,我一直在使用“无”,但是在这种情况下,“无”检查没有任何用处,因此我尝试不使用它。
myList = [MyAdt()] * 10
因此,基本上,它是创建此实例并将其乘以10倍。关于如何进行调整以便创建新实例的任何想法?
**如果您愿意,我会给您提供ADT,但我认为它们无关紧要。 **
答案 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)运算。它的操作数是list
和int
,使其与两个操作数均为数字类型时所求值的函数完全不同。
答案 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”,因为它是我们创建的第二个实例,而不是第一个。