我写了一个类似于:
的课程class EllipticCurve:
points = []
def generatePoints(a, b, p):
...
这会为曲线生成正确的点集。我想在不同的曲线上进行时间测试,所以写了一个主函数:
def main():
for i in range(5):
E = EllipticCurve(a, b, p) # with random values of a, b, p
E.generatePoints()
这会为第一次运行生成正确的点集,但在连续运行期间,会保留先前的点。为什么呢?
例如, 如果我打印E.points,首次运行后:
[(1, 2), (1, 3)] (say)
在下一次运行中打印:
[(1, 2), (1, 3), (1, 5), (1, 6)]
即使前两个元组没有计算出这个运行。
答案 0 :(得分:0)
声明该方式的points
成员具有类范围,即它为所有实例共享。
请改为:
class EllipticCurve:
def __init__(self):
self.points = []
def generatePoints(self, a, b, p):
... update self.points instead of EllipticCurve.points ...
答案 1 :(得分:0)
因为在{EllisticCurve类的生命周期中points[]
列表未被清除。它类似于Java中的静态字段。要使列表实例具体,您可以例如在构造函数中创建它。看看A和B之间的区别:
class A(object):
mylist = []
A.mylist
# []
A.mylist.append(1)
A.mylist
# [1]
a = A()
a.mylist
# [1]
class B(object):
def __init__(self):
self.mylist = []
B.mylist
# AttributeError: type object 'B' has no attribute 'mylist'
b= B()
b.mylist.append(1)
b.mylist
# [1]
b2 = B()
b2.mylist.append(2)
b2.mylist
# [2]
b.mylist
# [1]