2017-01-02 55 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

,你會做pw[mysheet] = locals()[mysheet]內環路

DEMO

>>> 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()。但請注意,得到解決的名稱將檢查目前的名稱空間。

+0

不,'dict'不僅需要'str'作爲關鍵字,而且還包含任何非可變對象,例如:'int','tuple','frozenset' ... –

+0

@LaurentLAPORTE完全忘了。感謝您通知err。 :) – Prajwal

1

不顧當地的全球問題,並專注於您所需的輸出,你可以做到以下幾點,如果你不介意重構你的輸入數據(變量賦值)模式是這樣的:

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

pw=dict() 

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

print(pw) 

這種方式,您所需的密鑰爲您的輸入列表項目的index 0,您的期望值列表爲index 1,將密鑰:對添加到pwdict是一項簡單的任務。