我要做到以下幾點:的Python:在一個列表賦值給變量或對象
a = 1
b = 2
c = 3
tom = [a,b,c]
for i in tom:
i = 6
期望的結果是a = 6
實際的結果是a = 1
我猜沒有某種執行力就沒有辦法做到這一點。正確?
我要做到以下幾點:的Python:在一個列表賦值給變量或對象
a = 1
b = 2
c = 3
tom = [a,b,c]
for i in tom:
i = 6
期望的結果是a = 6
實際的結果是a = 1
我猜沒有某種執行力就沒有辦法做到這一點。正確?
起初我誤解了你的問題,而且我看到這種說法是正確的。但我認爲這個問題表明需要更詳細地解釋Python如何工作。考慮在Python變量的最佳方式是考慮的變量名作爲具有箭頭附連到它們,和值作爲對象到這些箭頭點。變量名稱指向對象。所以,當你這樣做:
a = 1
你真的說:「a
點1
」。當你這樣做:
b = a
你真的說:「b
指向同一個對象a
」。一般情況下,一個變量不能指向另一個變量名;它只能指向另一個變量指向的相同對象。所以,當你這樣做:
tom = [a, b, c]
沒有創建一個指向變量名a
,b
,並c
清單;您正在創建一個指向與a
,b
和c
相同的對象的列表。如果你改變a
點,它對tom[0]
點沒有影響。如果你改變tom[0]
分,那麼它對a
點的位置沒有影響。
現在,正如其他人所指出的那樣,你可以編程使用exec
如你所說(不推薦),或通過改變globals()
改變變量名,醚的值(也不推薦)。但大多數時候,這是不值得的。
如果你真的想這樣做,我的建議可能不是簡單地使用字典(如DzinX建議的那樣),或者對於接近問題精神並且仍然合理清潔的解決方案,您可以簡單地使用可變對象。然後你可以使用getattr
和setattr
以編程方式改變該對象的屬性,像這樣:
>>> class Foo():
... pass
...
>>> f = Foo()
>>> f.a = 1
>>> setattr(f, 'b', 2)
>>> getattr(f, 'a')
1
>>> f.b
2
一般情況下,最好的解決辦法是隻使用一本字典。但偶爾會出現上述情況更好的情況。
tom = [a, b, c]
將值1,2和3放入列表中。一旦這些值在列表中,就無法知道指向它們的名稱。假設他們是全局變量,你可以(但幾乎可以肯定不應該)做:
tom = ["a", "b", "c"]
for n in tom:
globals()[n] = 1
試圖在循環中設置單個變量幾乎總是錯誤的做法。該值顯然有共同的東西,否則你不會想改變它們都在一個循環,所以它們存儲在一個表(或字典,如果你需要爲他們的名字)和訪問並改變他們那裏,而不是使用個體變量。
或者首先使用字典。 –
好點,我補充說。 – kindall
否否否否否。這是一種可怕而噁心的方式,你不應該在教這個。事實上,普通的python用戶甚至不需要知道'globals()'是被定義的。 –
更簡潔,
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])
如果要基於其原始值分配給每個不同的值可能很容易推廣。
這似乎是無償的。 – Marcin
這將是最好的,如果你沒有使用變量,但在字典鍵,這樣的:
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
這是一個想法。
seniority = [range(1, 6)]
people = ["Richard", "Rob", "Steve", "Terry", "Micah"]
people = seniority
print people
輸出:[[1,2,3,4,5,]]
應該'tom'是'[6,6,6]'然後?你知道'tom = [a,b,c]'的結果是'[1,2,3]'嗎?對原始變量的引用丟失,爲列表中的每個元素設置一個新值不會更新原始變量。 –
也不會改變你的列表「湯姆」。有關您正在嘗試完成的更多詳細信息,我可以給您一些更好的解決方案 –