2012-10-28 167 views
-1

我想改善我現有的代碼,有什麼辦法影響多個不同的變量,而不使用dict或列表或元組? 我想寫類似:for循環中的名稱格式

number1 = 1 
number2 = 2 
number3 = 3 

for i in (1,2,3): 
    number{i} += 1 

,然後有數字1 = 2 NUMBER2 = 3,number3的= 4

我在想格式化字符串,但它不工作,THX閱讀。這裏

+1

爲什麼沒有這些? – Aprillion

+0

因爲這是一個簡單的數字例子。我實際上是用我創建的類的對象做的事情,這些對象正在從sql選擇語句獲取值,並且我影響每個行的1個對象 – prince

+0

呵呵?只是遍歷行以影響每行的1個對象 - 如果可以使用索引,則使用列表(如果可以使用數據中的獲取值),請使用字典 – Aprillion

回答

3

一個更好的方法是使用字典:

In [26]: numbers={'number1': 1, 
    ....:   'number2' : 2, 
    ....:   'number3' : 3} 

In [27]: for i in (1,2,3): 
    ....:   numbers['number'+str(i)]+=1 
    ....: 

In [28]: numbers['number1'] 
Out[28]: 2 

In [29]: numbers['number2'] 
Out[29]: 3 

In [30]: numbers['number3'] 
Out[30]: 4 

否則,你也可以你globals()

In [31]: number1 = 1 

In [32]: number2 = 2 

In [33]: number3 = 3 

In [34]: for i in (1,2,3): 
    ....:  globals()['number'+str(i)]+=1 
    ....:  
    ....:  

In [35]: number1 
Out[35]: 2 

In [36]: number2 
Out[36]: 3 

In [37]: number3 
Out[37]: 4 
+1

globals()將返回一個字典 – Aprillion

+0

它是如何在類內工作的? globals()['self.number'+ str(i)] + = 1? – prince

+0

@kingpin裏面可以使用'locals()'。 –

3

您可以通過使用字典通過他們的名字的字符串表示訪問變量根據需要返回globals()locals() - 儘管如文檔中所述,如果修改locals()字典,您可能會發現事情並不像您預期​​的那樣運行,此答案底部的代碼片段。您還可以通過分別使用setattr(self, 'some_variable_name', value),setattr(ClassName, 'some_variable_name', value)setattr(ModuleName, 'some_variable_name', value)通過字符串標籤修改實例,類或模塊變量,其中self,ClassName和ModuleName分別是對類實例,類和模塊的引用。最後,通過使用exec來執行包含在字符串中的代碼,您總是可以達到您想要的效果。例如:

for i in range(5): 
    temp = i 
    exec('var%d = temp' % i) 
print var0, var1, var2, var3, var4 

將打印0 1 2 3 4

但是你爲什麼要做這些事情呢?如果您需要將任意字符串映射到值,則可以創建並使用字典。如果在你的例子中,你不是處理任意字符串,而是處理一系列變量,它們的名字末尾只有一個整數索引,則使用列表,因爲這就是列表的用途。

以我在第一段中描述的任何方式做事情都是令人困惑和毫無意義的,我從來沒有在真正的代碼中看到過。

我要再次強調的是,這裏最重要的事情,因爲阿什維尼喬杜裏已經指出的那樣,是有沒有理由通過字符串引用變量以這種方式,因爲如果你需要映射字符串值,您可以簡單地使用字典 - 如果您使用globals()locals(),則無論如何您都可以間接地完成該操作,因爲這些函數都會返回字典。


不管怎樣,作爲一個後記中,我提到的東西不太工作的權利,如果你修改這並不意味着在這個文檔中提到要修改的當地人()詞典,這句話

  • Note The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.

嗯,這裏是該點的說明,並可能它嘗試這種方法阻止任何人:

var1 = 'asdf' 
def test1(): 
    var1 = 'ghjkl' 
    print globals()['var2'] 
    print locals()['var2'] 

test1() 

def test2(): 
    globals()['var2'] = 'qwerty' 
    locals()['var2'] = 'uiop' 
    print var2 

test2() 

如果你運行上面的代碼會得到什麼?令我驚訝的是,它是:

asdf 
ghjkl 
qwerty 

的第一個測試表現爲我期望 - 在全局中查找發現功能外指定的值,並在當地人的查找發現本地分配的值。第二個測試是令人驚訝的 - 儘管我們已經爲全局變量賦值,並且在本地變量中賦值,但通過名稱本地引用該變量可以找到我們在字典中找到的值,而不是當地的字典。

+1

您發現的locals()事實是文檔說不編輯'locals()'的原因。 – DSM

+0

@DSM謝謝,當我剔除他們時,我錯過了文檔中的該行。我已經更新了我的答案以反映您的觀察。 –