2012-01-10 14 views
7

o, (bir dize) sadece değişkenin adı verilen, Python koduna sahip yerel değişkenler oluşturmak mümkün mü?Python'da "dinamik olarak" yerel değişkenler oluşturmak mümkün mü? sonraki çağrılar "() halk içinde 'xxx'" Gerçek dönecektir böylece

İşte görsel açıklanmıştır:

>>> 'iWantAVariableWithThisName' in locals() 
False 
>>> junkVar = 'iWantAVariableWithThisName' 
>>> (...some magical code...) 
>>> 'iWantAVariableWithThisName' in locals() 
True 

Ne amaçla için bu hile tamamen başka bir konudur gerektirir ... yardım

teşekkürler. ne kadar tehlikeli ve exec olduğunu kullanılarak hackish

Tabii
print 'iWantAVariableWithThisName' in locals() 
junkVar = 'iWantAVariableWithThisName' 
exec(junkVar + " = 1") 
print 'iWantAVariableWithThisName' in locals() 

, herkes söyleyecektir, ama sonra yani bu herhangi uygulama olacaktır: Eğer gerçekten bunu yapmak istiyor Eğer

+0

Bu karşı uyarılır fakat exec fonksiyonu kullanılarak piton 2.x yapılabilir - ama 3.0'da: http://stackoverflow.com/questions/1450275/modifying-locals-in-python – philofinfinitejest

+3

"Bu amaç için hangi hileye ihtiyacım olduğunu tamamen başka bir konu ..." - ve ** sonsuz derecede daha önemli **. Gerçekten ne yapmak istediğinizle ilgili soruyu sorun, nasıl yapmak istediğinizi düşündüğünüzle ilgili soruya değil. –

+0

Karl: MitchellSalad, bir yorumda bunun yerine iyi bir seçim kullandığını belirtti. –

cevap

9

, sen exec kullanabilirsiniz "kandırmaca."

+1

Heh. Hatta çok benzer cümleler kullandık - hatta italiklerin kullanımına bile! - OP'nin muhtemelen bunu yapmaması gerektiğini belirtmek için. Gerçekten Evet .. – DSM

+0

onu (neden olmamalı açıklamak) yapmanın bir açık yolu olmalı sanırım, ama seninki Yok junkVar ayarlar ve madeni bütün farkı yaratan 1 olarak ayarlar. :) +1 seninkine –

+0

Bu sadece yerel halk optimizasyonunu devre dışı bıraktığı için Python 2'de çalışır. * Bunu yaptığınızda, işleviniz daha yavaş çalışır *. Python 3'te hiç çalışmayacaktır. –

6

Sen oyun oynamak ve güncellemek yerli() elle, bazen çalışacak, ama yapmamalısın olabilir. Özel olarak dokümanlar konusunda uyarılır. Ben bunu yapmak olsaydı, muhtemelen exec kullanmak: yüz üzerinden

>>> 'iWantAVariableWithThisName' in locals() 
False 
>>> junkVar = 'iWantAVariableWithThisName' 
>>> exec(junkVar + '= None') 
>>> 'iWantAVariableWithThisName' in locals() 
True 
>>> print iWantAVariableWithThisName 
None 

Ama doksan üç kez gerçekten yerine bir sözlük kullanmak istiyorum.

+0

Yanıt için teşekkürler. Bu özel örnek için, yürütme çağrısı kodumun ürettiği çok sayıda değişken ad nedeniyle, bir sözlüğü yönetmekten çok daha lezzetli görünüyor. Belki de "bazen" çalışanı ile ne demek istediğini biraz daha ayrıntılı olarak açıklayabilir misiniz? EDIT: Bir sözlük iyi çalışacaktır. Detaylandırmaya gerek yok. :) – MitchellSalad

+0

Ne "bazen" çalışır exec kullanarak değil, yerel sözlük, güncelleniyor. Örneğin: 'locals() [" myvar "] = 1'. [Docs] (http://docs.python.org/library/functions.html#locals) ki: "Not: Bu sözlüğün içeriği değiştirilmemelidir; değişimler kullanılan yerel ve ücretsiz değişkenlerin değerlerini etkilemeyebilir tercüman tarafından. " –

+1

@MitchellSalad: - yani halk() [ 'junkVar'] = 99 - hafifçe tehlikeli ve anti-önerilir .. exec rağmen, güvenlik sorunlarını çalışması gerekir hayır, güncelleme halk() anlamına geliyordu. Zevklerimi paylaştığımdan emin değilim, ama: * daha fazla * değişken vardı, onları bir sözlük haline getirmem daha olasıydı. – DSM

-1

exec kullanmak gerek yok, ama halk() [dize] veya vars() veya globaller() da çalışır.

test1="Inited" 

if not "test1" in locals(): locals()["test1"] = "Changed" 
if not "test1" in locals(): locals()["test2"] = "Changed" 

print " test1= ",test1,"\n test2=",test2 
+1

Bunu bir fonksiyonda deneyin ve işe yaramayacak. – pyrospade

İlgili konular