2013-10-25 56 views
0

我正在使用graphics.py庫,需要根據用戶需要的數量(可以說是4)創建多個多邊形。每次迭代都會創建唯一對象的循環。 (基於哪個迭代)

我只需要知道如何爲這些多邊形中的每一個創建一個唯一的名稱,例如polygon1,polygon2,polygon4,polygon5。

謝謝。

+7

[你不想動態創建變量](http://stupidpythonideas.blogspot.com/2013/05/why-you-dont-want-to-dynamically-create.html),因爲你想要[將數據保留在變量名稱之外](http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html)。只需使用多邊形對象的「列表」,然後就可以將它們稱爲「多邊形[2]」,依此類推。 – abarnert

+0

保留在列表/字典/集取決於你如何訪問它們 –

+0

可能的重複[在Python中,如何在循環中創建大量變量?](http://stackoverflow.com/questions/ 8129190/in-python-how-to-create-a-loop-of-variable-of-variables) –

回答

1

你可以處理它作爲一個列表

polygon = [] 
polygon.append(...) 

和訪問他們作爲

polygon[2] 
2

如果你真的想這樣做,你可以:

for i in range(count): 
    new_poly = Polygon(whatever) 
    new_name = 'polygon{}'.format(i+1) 

然後,你必須將該新名稱和該新多邊形存儲在某處。也許是這樣的:

polygons = {} 
for i in range(count): 
    new_poly = Polygon(whatever) 
    new_name = 'polygon{}'.format(i+1) 
    polygons[new_name] = new_poly 

如果你認爲你寧願讓每個名字變成一個新的變量......這是一個壞主意。 You don't want to dynamically create variables,因爲你想keep data out of your variable names

真的,這裏根本不需要名稱。這造成的count多邊形列表:

polygons = [Polygon(whatever) for _ in range(count)] 

而現在,如果你需要用數字來訪問它們,只是這樣做:

polygons[2] 

(雖然知道列表是從0開始,不基於1)。或者,如果你需要訪問所有的人,你已經得到了整個列表,所以你不必在任何地方都寫(polygon1, polygon2, polygon3, polygon4);只是polygons

+0

Yikes,我忽略提及我使用循環的原因是爲了讓我可以操縱多邊形的屬性(將它們的座標向下移動1,超過1),然後再創建它們。 – MassDiffraction

+1

而且,那麼?我認爲這個解決方案仍然可以正常工作。如果是這樣,你甚至可能不需要動態創建變量。只需在我的循環中分配它們。 – aIKid

+0

我會努力工作並回復你。謝謝。 – MassDiffraction

0

糟糕的方式:

您可以使用exec

for i in range(5): 
    exec("polygon%d = Polygon(something)"%i) 

這是非常安全的,因爲i如果只是一個整數。但使用exec確實是不好的做法,因爲它非常脆弱。用戶可以輸入或不小心輸入一段代碼並弄亂你的記憶。所以,除非你真的這樣做,你不應該使用它。

另外,如果你是全局變量的粉絲,你可以使用它。

globals()["polygon%d"%i] = Polygon(something) 

但是也不建議使用全局變量。

更好的方式

或者,你可以將其存儲在一個列表,或字典:

for i in range(5): 
    lst.append(Polygon(something_else)) #store it in a list 
    dict['polygon%d'%i] = Polygon(another_thing) #store it in a dict 

希望這有助於!

+0

'exec'是_doubly_壞。如果你真的想動態地創建變量,可以使用'globals()[name] = value'(或'setattr(self,name,value)'等),而不是'exec'。 – abarnert

+0

是的,我知道。 – aIKid

+0

不,沒有理由甚至提到'exec'或'globals'。只要說出一個清單或一個字典,然後就可以了。 –