2009-06-29 13 views
18

मैं सिर्फ अगर कोई एक तरह से कुछ इस तरह के लिए पाश के लिए एक के आधार पर चर नाम बदलने के लिए की जानता था सोच रहा था के लिए अजगर के साथ चर नाम बदलने डेटा को समायोजित करने के लिए। धन्यवाद!छोरों

~ सैम

+3

परिवर्तनीय नाम बदलने का बिंदु क्या होगा? –

उत्तर

2

ऐसा लगता है कि आप के बजाय एक सूची का उपयोग करना चाहते:

group=[] 
for i in range(3): 
    group[i]=self.getGroup(selected, header+i) 
+3

क्या आपका मतलब "शब्दकोश" या "सूची" है? एक ऐरे क्या है? –

+1

मेरा मतलब है सूची, धन्यवाद। मैंने बहुत समय के लिए "arrays" वस्तुओं का ऑर्डर संग्रह कहा है, और कभी भी PHP का उपयोग नहीं किया है, जहां उन्होंने शब्द को "सहयोगी सरणी" का अर्थ दिया है। –

34

आप शायद अलग चर के बजाय एक dict चाहते हैं।

for i in range(3): 
    locals()["group"+str(i)] = self.getGroup(selected, header+i) 

दूसरी ओर, क्या आप वास्तव में चाहते है अगर वर्ग के उदाहरण चर को संशोधित करने उदाहरण के लिए:

d = {} 
for i in range(3): 
    d["group" + str(i)] = self.getGroup(selected, header+i) 

आप वास्तव में स्थानीय चर को संशोधित करने पर जोर देते हैं, तो आप locals समारोह इस्तेमाल कर सकते हैं आप कर रहे हैं, तो आप setattr समारोह

for i in group(3): 
    setattr(self, "group"+str(i), self.getGroup(selected, header+i) 

और निश्चित रूप से, मैं इन उदाहरणों के सभी के साथ यह मानते हुए कि कर रहा हूँ का उपयोग कर सकते है कि आप न सिर्फ एक सूची चाहते हैं:

groups = [self.getGroup(i,header+i) for i in range(3)] 
-1

आप सकता है पहुँच अपनी कक्षा के __dict__ विशेषता:

for i in range(3) 
    self.__dict__['group%d' % i]=self.getGroup(selected, header+i) 

लेकिन क्यों तुम सिर्फ एक सरणी group नामित उपयोग नहीं कर सकते?

+1

स्वयं .__ dict __ [आदि] का उपयोग करने के बजाय आप setattr (self, आदि) का उपयोग करना चाहेंगे, और मुझे यकीन है कि आप 'सरणी' के बजाय 'सूची' कहना चाहते हैं। हालांकि स्ट्रिंग स्वरूपण का अच्छा उपयोग। – tgray

7

एक सूची का उपयोग करें।

groups = [0]*3 
for i in xrange(3): 
    groups[i] = self.getGroup(selected, header + i) 

या अधिक "Pythonically":

groups = [self.getGroup(selected, header + i) for i in xrange(3)] 

क्या इसके लायक है के लिए, आप चर "गलत" जिस तरह से, शब्दकोश जो उनके मूल्यों रखती संशोधित करके यानी बनाने के लिए कोशिश कर सकते:

l = locals() 
for i in xrange(3): 
    l['group' + str(i)] = self.getGroup(selected, header + i) 

लेकिन यह वास्तव में खराब रूप है, और संभवतः काम करने की भी गारंटी नहीं है।

1

निश्चित रूप से स्वीकार किए गए समाधान में वर्णित "समूह" + str (i) कुंजी का उपयोग करके एक नियम का उपयोग करना चाहिए, लेकिन मैं निष्पादन का उपयोग करके समाधान साझा करना चाहता था। आदेशों में तारों को पार्स करने का यह तरीका & गतिशील रूप से निष्पादित करें। यह एक नियम का उपयोग करने के बजाय आपकी आवश्यकता के अनुसार इन स्केलर चर नामों को बनाने की अनुमति देगा। यह इस बात के संबंध में मदद कर सकता है कि क्या नहीं करना है, और सिर्फ इसलिए कि आप इसका मतलब यह नहीं कर सकते कि आपको चाहिए। इसका एक अच्छा समाधान केवल तभी अदिश चर का उपयोग कर एक कठिन आवश्यकता है:

l = locals() 
for i in xrange(3): 
    exec("group" + str(i) + "= self.getGroup(selected, header + i)") 

एक अन्य उदाहरण है जहां यह एक Django मॉडल उदाहरण का उपयोग काम कर सकता था।कार्यकारी वैकल्पिक समाधान पर टिप्पणी की है और इस तरह के मामले dict गुण का उपयोग से निपटने में बेहतर तरीके से अधिक समझ में आता है:

Class A(models.Model): 

    .... 

    def __getitem__(self, item): # a.__getitem__('id') 
     #exec("attrb = self." + item) 
     #return attrb 
     return self.__dict__[item] 

इसे और अधिक मतलब हो सकता है पहली जगह पाने के लिए setattr में एक शब्दकोश से विस्तार करने के लिए और Getattr कार्यों।

एक ऐसी स्थिति जिसमें पार्सिंग शामिल है, उदाहरण के लिए & पाइथन कमांड को गतिशील रूप से निष्पादित करते हुए, निष्पादन वही है जो आप चाहते हैं :) निष्पादन here पर अधिक।

संबंधित मुद्दे