2016-12-13 18 views
0

私は、Pythonに新たなんだと多分これは音のロジックが、どのようにしない、私は仕事にこれを行うことができます。Pythonの項目をダイナミックにリストに追加するには?

p1=(20,50) 
p2=(70,80) 
p3=(100,140) 
listP=[] 
#listP=[p1,p2,p3] #manually it works 
for i in range(3): 
    listP.append('p'+str(i)) 

結果ではなく、(P1、P2など)の、ポイントのリストでなければなりません ありがとうございます!あなたの例では

+4

を使用することができますか? – TigerhawkT3

+0

*手作業で動作* - あなたが書いたように、手作業は解決策になることができます。どのように最終的なリストの内容を見てください表示 – RomanPerekhrest

答えて

1

p1, p2, p3識別子ですが、あなたのfor -loopに、あなたはあなたのリストに文字列としてこれらの識別子の名前を追加します。したがって、これらの文字列に一致する識別子の逆参照される値のリストではなく、文字列のリストを取得します。この動作は、意図されたものであり、望ましいものです。

識別子は、参照する値にアクセスするためにコードで使用する名前付きハンドルの一種です。一般に、プログラミング言語は、ほとんどの場合意図しない動作であるため、一部のローカル識別子に一致する文字列を実際の参照に自動的に変換しません。スコープとセキュリティを考えてください。

通常、文字列を識別子に変換しないでください。 Pythonでは、getattrを使ってそうすることができます。しかし、私はここでこれを概説しません。なぜなら、あなたはそうしてはならないからです。。あなたはそうのようなあなたのポイントにアクセスすることができ、これらのケースでは

# List: 
plist = [(20, 50), (70, 80), (100, 140)] 

# Dict: 
pdict = { 
    'p1': (20, 50), 
    'p2': (70, 80), 
    'p3': (100, 140) 
} 

# For list case: 
for i in range(3): 
    print(plist[i]) 

# For dict case: 
for i in range(3): 
    print(pdict['p{:d}'.format(i)]) 
+0

辞書を使用することは正しいアプローチのように思える。しかし、変数名に動的にアクセスする方法を知ることも時々役に立ちます。 –

+0

変数名を文字列として作成し、それらを動的に逆参照することは、ほぼすべてのレベルでのコーディングが悪いことです。確かに知っていいですが、通常、それはあなたがそれを行う必要がある場合、大きな設計上の欠陥を示します。デバッグ、リファクタリング、検査(名前はいくつですか?)はどうですか? – jbndlr

+0

非常に合意して、プログラムの設計/アルゴリズムの変更が必要です。 –

1

もし

あなたのケースのためのより良いアプローチは、直接listdict構造であなたのポイントをインスタンス化することです文字列として名前を使用して変数にアクセスしたい場合は、locals()またはvars()(このために@Wingston Sharonに感謝します)を使用してください。

# Using locals() 
for i in range(3): 
    listP.append(locals()['p' + str(i)]) 

# Using vars() 
for i in range(3): 
    listP.append(vars()['p' + str(i)]) 
+1

これは問題Xの解決策Yです([XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)参照)とその非常にハックリな解決策です。 – TigerhawkT3

1

あなたはなぜあなたの代わりに最初の場所で独立して、名前付き変数のリストとしてそれらを定義していないvars()

for i in range(1,4): 
    listP.append(vars()['p'+str(i)]) 
+0

ニース、私は 'vars()'を見逃しました。 – Fejs

+1

これは問題Xの解決策Yです([XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)参照)とその非常にハックな解決策です。 – TigerhawkT3

関連する問題