2011-03-22 45 views
0

用相同的列表數據變量,但不同的對象,這是我的代碼:定義使用python

attackUp = [10, 15,10, 15,10, 15] 
defenceUp = [10, 15,10, 15,10, 15] 
magicUp = [10, 15,10, 15,10, 15] 
attType = [1,1,1,1,1,1] 
weightDown = [10, 15,10, 15,10, 15] 

#裝飾器數據 
accAttackSword = [100, 100,100, 100,100, 100] 
accAttackSaber = [100, 100,100, 100,100, 100] 
accAttackAx = [100, 100,100, 100,100, 100] 
accAttackHammer = [100, 100,100, 100,100, 100] 
accAttackSpear = [100, 100,100, 100,100, 100] 
accAttackFight = [100, 100,100, 100,100, 100] 

accAttackBow = [100, 100,100, 100,100, 100] 
accAttackMagicGun = [100, 100,100, 100,100, 100] 
accAttackMagic = [100, 100,100, 100,100, 100] 
mStrInstrument = [100, 100,100, 100,100, 100] 
mStrCharms = [100, 100,100, 100,100, 100] 
accDefencePhy = [100, 100,100, 100,100, 100] 
accDefenceMag = [100, 100,100, 100,100, 100] 
accWeight = [100, 90, 0, 0, 100, 90] 

#戰術書數據 
bookTurn = [1,1] 
bookAttackPhy = [100, 100] 
bookAttackMag = [100, 100] 
bookStrInstrument = [100, 100] 
bookStrCharms = [100, 100] 
bookDefencePhy = [100, 100] 
bookDefenceMag = [100, 100] 
bookWeight = [100, 100] 

你可以看到:許多變量具有相同的價值,但我不能確定他們是這樣的:

bookAttackPhy = bookAttackMag =bookStrInstrument=bookStrCharms=bookDefencePhy=[100, 100] 

因爲如果其中一個變化,所有變化。

哪個是定義這些變量最好也最容易的?

+1

您是否定義了6個不同字符的特徵?並使用索引0到5訪問給定字符的特定屬性?定義一個類並使這些實例屬性!這是面向對象的原因! – PaulMcG 2011-03-22 03:40:36

+0

[如何在Python中複製或複製列表?](http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list-in-python) – 2015-04-03 15:18:13

+0

@ArtjomB 。:複製列表是一種解決方法。針對OP問題的有效解決方案是創建一個像@Paul McGuire建議的自定義對象,並提供枚舉其屬性的方法,例如'爲了自己的名字。_skill_names:setattr(self,name,[100] * 5)' – jfs 2015-04-05 12:05:42

回答

5

那麼,在正確的方向邁出的一步是創建一個基本列表,然後使用切片表示法複製:

base = [100, 100, 100, 100] 
value_a = base[:] 
value_b = base[:] 

等。這對於較短的列表來說並沒有多大幫助,但至少對於較長的列表應該是有用的。

但我認爲更普遍的是,更豐富的數據結構對於這樣的事情會更好。爲什麼不創建一個類?然後你可以使用setattr以相當直接的方式填寫班級成員。

class Weapons(object): 
    def __init__(self, base): 
     for weapon in ["saber", "sword", "axe"]: 
      setattr(self, weapon, base[:]) 

w = Weapons([100, 100, 100]) 
print w.__dict__ 

#output: {'sword': [100, 100, 100], 
#   'saber': [100, 100, 100], 
#   'axe': [100, 100, 100]} 

w.axe[0] = 10 
print w.axe  # output: [10, 100, 100] 
print w.sword  # output: [100, 100, 100] 
+0

+1用於讓一個類對數據進行分區而不是擁有大量的全局數組。假設陣列可能有某種結構,但OP沒有給我們任何可以幫助我們的信息。 – unholysampler 2011-03-22 01:55:16

1

定義它們都作爲空數組,然後組需要相同的值到一個列表中,並通過該列表循環,分配共同的值,以每個變量的那些。

1

你可以這樣做:

defaultAttack = [100, 100,100, 100,100, 100] 
accAttackSword = list(defaultAttack) 
accAttackSaber = list(defaultAttack) 

list()構造使得複製列表,所以他們將能夠獨立地改變。

1

您可以使用列表乘法

accAttackSword = [100]*6 
.... 
bookWeight = [100]*2 
.... 

你可能會考慮都具有類似的前綴的變量的分組要麼到字典或嵌套列表(編輯 - 或類/對象)。這對組織後期可能會有好處,並且可以讓您遍歷並將它們全部設置爲相同的初始值。

bookVars = ['AttackPhy', 'AttackMag', 'StrInstrument', 'StrCharms'] 
bookValues = dict() 
for i in bookVars: 
    bookValues[i] = [100]*2 

並訪問...

bookValues 
    {'AttackMag': [100, 100], 'StrCharms': [100, 100], 'StrInstrument': [100, 100], 'AttackPhy': [100, 100]} 
bookValues['AttackMag'] 
    [100, 100] 

編輯 - 退房senderle的事情太多。一眼看上去他看起來好一點,但是ID肯定會考慮使用我們的一個想法 - 關鍵是要多構造它一點。每當有一組具有相似前綴名稱的變量時,可以考慮以更有意義的方式將它們組合在一起。你已經在你的腦海裏這樣做了,所以請遵循下面的代碼!

+0

+1列表乘法 – senderle 2011-03-22 02:47:07