2011-08-15 17 views
35

मैं कुछ इस तरह करने में सक्षम होना चाहते हैंएक्सेस करना मॉड्यूल स्तर चर,

#secondmodule 
import mymodule 
mymodule.load() 

#thirdmodule 
from mymodule import var 
print var #Shouldn't be None 

लेकिन मैं मॉड्यूल में परिभाषित फ़ंक्शन से मॉड्यूल चर का संदर्भ कैसे लें, यह नहीं पता।

यह संभव है? या क्या मुझे हर जगह उस पर वैश्विक घोषणा करने की आवश्यकता होगी जिसे मैं इसका उपयोग नहीं करना चाहता हूं। या क्या मैं इस पूरी तरह से गलत पर जा रहा हूं?

उत्तर

50

बस बदलने

def load(): 
    global var 
    var = something() 

वैश्विक चर केवल पढ़ने के लिए भाई तरीकों से कर रहे हैं। अधिक सटीक रूप से जब तक एक वैरिएबल को ग्लोबल के रूप में निर्दिष्ट नहीं किया जाता है, पायथन इसे स्थानीय मानते हैं, लेकिन स्थानीय चर नाम में पढ़ने के लिए स्थानीय चर नाम में पढ़ने की पहुंच मॉड्यूल-स्तरीय दायरे तक पहुंच जाएगी।

भी use of “global” keyword in python और global बयान

+0

समझ में आता है और सुंदर काम करता है, मैं आपको वोट दूंगा, लेकिन मैं अभी तक 15 पर नहीं हूं। धन्यवाद। – dennmat

+0

आपका स्वागत है :) – Evpok

+0

@ डेनमत वैश्विक चर का उपयोग न करें। यदि आपको लगता है कि आपको उनकी आवश्यकता है तो यह आमतौर पर एक संकेत है कि आपका डिज़ाइन त्रुटिपूर्ण है। – schlamar

15

के बारे में अधिक जानकारी के लिए doc देखें आप ज्यादातर इसे लगता है। आप केवल इस तथ्य को याद कर रहे हैं कि "मॉड्यूल-स्तर" चर को पायथन में वैश्विक कहा जाता है। (वे दूसरे शब्दों में, वास्तव में एक वैश्विक है, लेकिन केवल मॉड्यूल वे घोषित किये गए हैं करने के लिए वैश्विक नहीं हैं।)

किसी भी समारोह जहां एक वैश्विक चर संशोधित में (आप के लिए नाम एक अलग वस्तु का उल्लेख करना चाहते हैं), इसे वैश्विक घोषित किया जाना चाहिए। इसलिए आपकी load() फ़ंक्शन को शुरुआत में global var की आवश्यकता है। यदि आप केवल वैश्विक चर के मान का उपयोग कर रहे हैं, या यदि यह एक उत्परिवर्तनीय प्रकार है जैसे कि सूची और आप इसे संशोधित कर रहे हैं, लेकिन जिस ऑब्जेक्ट को इंगित करता है उस वस्तु को नहीं बदल रहा है, तो आपको इसे वैश्विक घोषित करने की आवश्यकता नहीं है।

import कथन है, जैसा कि आपने पाया है, आप मॉड्यूल-स्तरीय चर को एक मॉड्यूल से दूसरे में कैसे आयात कर सकते हैं।

+0

तत्काल उत्तर के लिए धन्यवाद, जो वास्तव में समाधान था, मुझे ग्लोबल्स और पायथन स्टैक्स को थोड़ा और समझने में मदद करता है। – dennmat

+1

यह मेरा संदेह है, '।यदि आप केवल वैश्विक चर के मान का उपयोग कर रहे हैं, या यदि यह एक उत्परिवर्तनीय प्रकार है जैसे कि सूची और आप इसे संशोधित कर रहे हैं, लेकिन जिस ऑब्जेक्ट को इंगित करता है उस वस्तु को नहीं बदल रहा है, तो आपको इसे वैश्विक घोषित करने की आवश्यकता नहीं है। धन्यवाद @kindall! – swdev

+0

मेरे मामले में, मैं अपनी विधि में वैश्विक चर का उपयोग कर रहा था, मैं इसे कहीं भी नहीं बदल रहा था। अगली कॉल पर, यह खाली था। यकीन नहीं है कि क्यों। :( –

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