python中的椭圆曲线范围

时间:2014-04-07 11:57:12

标签: python

我写了一个类似于:

的课程
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)]

即使前两个元组没有计算出这个运行。

2 个答案:

答案 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]