动态定义变量名



我已经编写了一些类,我想通过创建我的类的多个实例来测试它们。我希望这些实例的名称遵循模式p1p2等:

p1 = Point(1,1)
p2 = Point(2,2)
p3 = Point(3,3)

对于很多变量,有没有一种方法可以快速做到这一点?类似这样的东西:

for i in range(1,1000):
    *magic goes here*
isinstance(p500, Point) # True

它被称为列表:

p = [Point(1, 1), Point(2, 2), Point(3, 3)]

现在p[0]就是你的p1,等等。

p = [Point(i, i) for i in range(1, 1000)]
isinstance(p[500], Point)  # True

您可以修改当前范围更改globals()

例如:

globals()['p234'] = Point(1, 2)
print p234

然而,这是一种质量极低的方法:很难理解、维护,会造成可怕的范围污染,而且速度很慢(尽管这可能无关紧要)。使用合适的数据容器,我建议使用一个列表:

points = [Point(i, i) for i in xrange(500)]
assert isinstance(p[-1], Point)

通过这种方式,你可以对每个对象进行断言,比如:

points = [Point(i, i) for i in xrange(500)]
for point in points:
    assert isinstance(point, Point)

您可以将它们作为关键字存储在字典中

vars_dict = {}
for i in range(1,1000):
    vars_dict['p{}'.format(i)] = Point(i, i)
isinstance(vars_dict['p500'], Point) # True

或者像@RemcoGerlich做一样在可迭代中

最新更新