2017-01-02 10 views
-2

同じ名前の値を持つ辞書を作成しようとしています。例えば、 mylistキーの値が['a'、 'b']である必要があります 次のコードは、リストを正しい名前に置き換えられません。forループのローカルスコープとグローバルスコープ

mylist=['a', 'b'] 
yourlist=['x', 'y'] 
pw=dict() 
for mysheet in ('mylist', 'yourlist'): 
    pw[mysheet] = mysheet 

pw 
{'mylist': 'mylist', 'yourlist': 'yourlist'} 

# expected result 
#{'mylist': ['a', 'b'] , 'yourlist': ['x', 'y']} 

forループには、機能と同じようにローカルスコープとグローバルスコープがありますか?

+0

何をしようとしていますか?文字列の組をforループに実際に渡しています。 – Prajwal

+0

@karthikrいいえ、OPが望むものではありません。 OPに:あなたは何を期待するのでしょうか?ループ内の 'mysheet'は、リストではない文字列を参照します。 – Li357

+0

[名前の解決](https://docs.python.org/3.5/reference/executionmodel.html#resolution-of-names)を参照してください。 *名前がコードブロックで使用されている場合は、最も近い囲みスコープを使用して解決されます* – Li357

答えて

2

あなたのユースケースは本当にわかりません。一般的に、これは基本的にlocals() context

を使用している、あなたはループ

DEMO

pw[mysheet] = locals()[mysheet]を行うだろう。しかし、あなたはこれを達成する方法の1つを

に従うことは非常に良いコーディングパターンではありません

>>> mylist=['a', 'b'] 
>>> yourlist=['x', 'y'] 
>>> pw = {} 
>>> for mysheet in ('mylist', 'yourlist'): 
...  pw[mysheet] = locals()[mysheet] 
... 
>>> pw 
{'yourlist': ['x', 'y'], 'mylist': ['a', 'b']} 
>>> 
2

これを実装する方法です。

for name, mysheet in ('mylist', mylist), ('yourlist',yourlist): 
    pw[name] = mysheet 

また、実際の変数ではなく、文字列タプルを渡していました。

karthikrで述べたように、locals()も使用できます。しかし、解決される名前は、の現在の名前空間をチェックすることに注意してください。

mylist=['mylist',['a', 'b']] 
yourlist=['yourlist',['x', 'y']] 

pw=dict() 

for item in (mylist, yourlist): 
    pw[item[0]] = item[1] 

print(pw) 

この方法で、:あなたはこのようなあなたの入力データ(変数割り当て)パターンをリファクタリング気にしない場合

+0

いいえ、 'dict'は' str'をキーとして扱うだけでなく、 'int'、' tuple'、 'frozenset'のように可変ではないオブジェクトを取ります... –

+0

@LaurentLAPORTE完全に忘れました。間違いを知らせてくれてありがとう。 :) – Prajwal

1

ローカルグローバル質問を無視して、所望の出力に焦点を当て、次のことを行うことができます目的のキーを入力リスト項目のindex 0、希望する値リストをindex 1とすると、キーを追加するのは簡単な作業です:pwdictにペアを追加します。

関連する問題