2012-01-24 37 views
4

我要做到以下幾點:的Python:在一個列表賦值給變量或對象

a = 1 
b = 2 
c = 3 
tom = [a,b,c] 
for i in tom: 
    i = 6 

期望的結果是a = 6

實際的結果是a = 1

我猜沒有某種執行力就沒有辦法做到這一點。正確?

+1

應該'tom'是'[6,6,6]'然後?你知道'tom = [a,b,c]'的結果是'[1,2,3]'嗎?對原始變量的引用丟失,爲列表中的每個元素設置一個新值不會更新原始變量。 –

+0

也不會改變你的列表「湯姆」。有關您正在嘗試完成的更多詳細信息,我可以給您一些更好的解決方案 –

回答

6

起初我誤解了你的問題,而且我看到這種說法是正確的。但我認爲這個問題表明需要更詳細地解釋Python如何工作。考慮在Python變量的最佳方式是考慮的變量名作爲具有箭頭附連到它們,和值作爲對象到這些箭頭點。變量名稱指向對象。所以,當你這樣做:

a = 1 

你真的說:「a1」。當你這樣做:

b = a 

你真的說:「b指向同一個對象a」。一般情況下,一個變量不能指向另一個變量名;它只能指向另一個變量指向的相同對象。所以,當你這樣做:

tom = [a, b, c] 

沒有創建一個指向變量名ab,並c清單;您正在創建一個指向與abc相同的對象的列表。如果你改變a點,它對tom[0]點沒有影響。如果你改變tom[0]分,那麼它對a點的位置沒有影響。

現在,正如其他人所指出的那樣,你可以編程使用exec如你所說(不推薦),或通過改變globals()改變變量名,醚的值(也不推薦)。但大多數時候,這是不值得的。

如果你真的想這樣做,我的建議可能不是簡單地使用字典(如DzinX建議的那樣),或者對於接近問題精神並且仍然合理清潔的解決方案,您可以簡單地使用可變對象。然後你可以使用getattrsetattr以編程方式改變該對象的屬性,像這樣:

>>> class Foo(): 
...  pass 
... 
>>> f = Foo() 
>>> f.a = 1 
>>> setattr(f, 'b', 2) 
>>> getattr(f, 'a') 
1 
>>> f.b 
2 

一般情況下,最好的解決辦法是隻使用一本字典。但偶爾會出現上述情況更好的情況。

4

tom = [a, b, c]將值1,2和3放入列表中。一旦這些值在列表中,就無法知道指向它們的名稱。假設他們是全局變量,你可以(但幾乎可以肯定不應該)做:

tom = ["a", "b", "c"] 
for n in tom: 
    globals()[n] = 1 

試圖在循環中設置單個變量幾乎總是錯誤的做法。該值顯然有共同的東西,否則你不會想改變它們都在一個循環,所以它們存儲在一個表(或字典,如果你需要爲他們的名字)和訪問並改變他們那裏,而不是使用個體變量。

+0

或者首先使用字典。 –

+0

好點,我補充說。 – kindall

+2

否否否否否。這是一種可怕而噁心的方式,你不應該在教這個。事實上,普通的python用戶甚至不需要知道'globals()'是被定義的。 –

1

更簡潔,

a, b, c = map(lambda x: 6, [1, 2, 3]) 

a, b, c = 1, 2, 3 
a, b, c = map(lambda x: 6, [a, b, c]) 

如果要基於其原始值分配給每個不同的值可能很容易推廣。

+0

這似乎是無償的。 – Marcin

2

這將是最好的,如果你沒有使用變量,但在字典鍵,這樣的:

values = { 
    'a': 1, 
    'b': 2, 
    'c': 3 
} 

for k in values: 
    values[k] = 6 

print values['a'] 
# prints: 6 

如果你想改變只有一些值,使用:

for k in ['a', 'c']: 
    values[k] = 6 
0

這是一個想法。

seniority = [range(1, 6)] 
people = ["Richard", "Rob", "Steve", "Terry", "Micah"] 
people = seniority 
print people 

輸出:[[1,2,3,4,5,]]