簡體   English   中英

如何在Python中使用與對象名稱相同的字符串來訪問對象本身?

[英]How can I use a string with the same name of an object in Python to access the object itself?

例如,在下面的代碼中,我想使用x作為參考獲得列表[1,2,3]。

In[1]: pasta=[1,2,3]
In:[2]: pasta
Out[2]: [1, 2, 3]
In [3]: x='pas'+'ta'
In [4]: x
Out[4]: 'pasta'

你要做的是一個不好的做法。

你真正需要的是一個dict

>>> dct = {'pasta': [1,2,3]}
>>> x = 'pas' + 'ta'
>>> dct[x]
[1, 2, 3]

這是您嘗試實現的實際任務的正確數據結構 :使用字符串訪問對象。

其他答案建議(或只是表現出來)以不同的方式來做到這一點。 由於Python是一種非常靈活的語言,你幾乎總能找到一種特定任務的不同方式,但“應該有一種 - 最好只有一種 - 明顯的方式” [1]

所有這些人都會做這項工作,但並非沒有缺點:

  • locals()的可讀性較低,不必要的復雜,在某些情況下也存在風險(參見Mark Byers的回答)。 如果你使用locals()你將把真正的變量和數據庫變量混合在一起,這很麻煩。
  • eval()很簡單,是一種“動態獲取動態源代碼的快捷方式” [2],也是一種不好的做法

如果對正確的選擇方式存在疑問,那么遵循PythonZen可能就是一個開始。

嘿,甚至可以使用InteractiveInterpreter來使用字符串訪問對象,但這並不意味着我要去。

好吧,要做你真正要求的,你可以使用locals

>>> locals()[x]
[1, 2, 3]

然而,這樣做幾乎總是一個壞主意。 正如Sven Marnach在評論中指出的: 保持數據不受變量名稱的影響 將變量用作數據也可能存在安全風險。 例如,如果變量的名稱來自用戶,則他們可能能夠讀取或修改您從未打算訪問的變量。 他們只需要猜測變量名稱。

這將是更好的使用字典來代替。

>>> your_dict = {}
>>> your_dict['pasta'] = [1, 2, 3]
>>> x = 'pas' + 'ta'
>>> your_dict[x]
[1, 2, 3]

像其他指出的那樣,你通常應該避免這樣做,只使用字典(在你給出的例子中)或在某些情況下使用列表(例如,而不是使用my_var1, my_var2, my_var3 - > my_vars )。

但是,如果你仍然想這樣做,你有幾個選擇。

你可以這樣做:

locals()[x]

要么

eval(x) #always make sure you do proper validation before using eval. A very powerfull feature of python imo but very risky if used without care.

如果面食是一個對象屬性,您可以通過以下方式安全地獲取它:

getattr(your_obj, x)

用這個

hello = [1,2,3]
print vars()['hello']

返回[1, 2, 3]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM