2012-01-24 12 views
4

オブジェクト:Pythonの:リスト内の変数に値を割り当てるか、私は次の操作を実行したい

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

所望の結果はa = 6

実際の結果は、私は推測しているa = 1

です何かのエグゼクティブなしでこれを行う方法はないということです。正しい?

+1

は 'し、[6,6]、[6]'ことtom'べきか? 'tom = [a、b、c]'の結果は '[1,2,3]'であることを知っていますか?元の変数への参照が失われ、リストの各要素の新しい値を設定しても元の変数は更新されません。 –

+0

あなたのリスト「tom」も変更されません。あなたが何をしようとしているのかについての詳細を私はあなたにもっと良い解決策を与えることができます –

答えて

6

最初はあなたの質問を誤解していました。しかし、私はこの質問が、Pythonがどのように動作するかをより詳細に説明する必要があると考えています。 Pythonで変数を考える最も良い方法は、変数名にの矢印が付いていると考えることと、それらの矢印が指すオブジェクトとしての値を考えることです。変数名はオブジェクトを指します。だから、これを行うと:あなたは本当に「1aポイント」を言っている

a = 1 

。そして、あなたがこれを行うとき:あなたは本当に「aと同じオブジェクトへのbポイント」を言っている

b = a 

。通常、変数は別の変数名を指すことはできません。他の変数が指し示すのと同じオブジェクトだけを指すことができます。だから、あなたが行う場合は、この:あなたは変数名ab、およびcを指し示すリストを作成していない

tom = [a, b, c] 

ab、およびcという同じオブジェクトを指すリストを作成しています。 aのポイントを変更した場合は、tom[0]のポイントに影響しません。 tom[0]のポイントを変更すると、aのポイントには影響しません。他の人が指摘しているよう

今、あなたはプログラムであなたは(推奨されません)提案として、またはglobals()を変更することによってexecを使用して、エーテル変数名の値を変更することができます(また、推奨されません)。しかし、ほとんどの場合、それだけの価値はありません。

これを本当にしたいのであれば、私の提案は辞書を使うことです(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、]

関連する問題