क्या केवल पायथन में कोई मान बताए बिना एक चर घोषित करना संभव है?


288

क्या पायथन में वैरिएबल घोषित करना संभव है?

var

ताकि यह किसी के लिए भी शुरू हो? ऐसा लगता है कि पायथन इसकी अनुमति देता है, लेकिन जैसे ही आप इसे एक्सेस करते हैं, यह क्रैश हो जाता है। क्या यह संभव है? यदि नहीं, तो क्यों?

संपादित करें: मैं इस तरह के मामलों के लिए यह करना चाहता हूं:

value

for index in sequence:

   if value == None and conditionMet:
       value = index
       break

डुप्लिकेट

सम्बंधित


1
एक छोटा सा कार्यक्रम पोस्ट कर सकता है जो इस कारण बनता है।
प्रीत संघ

आपने एक डुप्लिकेट प्रश्न पोस्ट किया है, इस प्रश्न को दूसरे के पक्ष में बंद करने के लिए मतदान किया है।
जेरब

अभी भी कुछ अंतर है, यह एक घोषित करके केवल एक चर का उपयोग नहीं कर सकता है।
जोन वेंज

वास्तव में अजगर दुनिया में एक चर घोषित करने जैसी कोई चीज नहीं है, जैसा कि आपका पहला सवाल बताता है।
हार्ले होल्कोम्ब

1
किसी ने कभी यह नहीं कहा कि 'बस इसे असाइन करें' क्योंकि चर उन्हें अवधि से पहले दिए गए हैं। और अजगर में चर प्रकार की जानकारी नहीं है। वस्तुएं ऐसा करती हैं। चर केवल उस समय वस्तु को धारण करने के लिए होते हैं। इसके अलावा, उपरोक्त कार्यक्रम को पहली पंक्ति पर NameError अपवाद फेंकना चाहिए। (जो मुझे 2.X और 3.X दोनों में मिलता है)
osirisgothra

जवाबों:


359

ऐसा क्यों न करें:

var = None

अजगर गतिशील है, इसलिए आपको चीजों को घोषित करने की आवश्यकता नहीं है; वे स्वचालित रूप से पहले दायरे में मौजूद हैं जहां उन्हें सौंपा गया है। तो, आप सभी की जरूरत है ऊपर के रूप में एक नियमित रूप से पुराने असाइनमेंट स्टेटमेंट है।

यह अच्छा है, क्योंकि आप कभी भी एक असम्बद्ध चर के साथ समाप्त नहीं होंगे। लेकिन सावधान रहें - इसका मतलब यह नहीं है कि आप गलत तरीके से प्रारंभिक चर के साथ समाप्त नहीं होंगे । यदि आप कुछ करने के लिए init करते हैं None, तो सुनिश्चित करें कि आप वास्तव में क्या चाहते हैं, और यदि आप कर सकते हैं तो कुछ अधिक सार्थक असाइन करें।


1
मैं ऐसा करने जा रहा था, लेकिन बस सोचा था कि यह ऐसा होगा।
जोन वेंज

7
बिंदु स्पष्ट होने के लिए है, अंतर्निहित नहीं है। प्रारंभिक मूल्य क्या है, इसका कोई अनुमान नहीं है। कोई सोच नहीं रहा है कि एक असिंचित चर एक अपवाद फेंकता है या जादुई रूप से एक उपयोगी मूल्य है।
S.Lott

2
मेरे पास केवल यही मुद्दा है कि मैं एक काउंटर (minValue) का ट्रैक रख रहा था और किसी भी समय इसका मान इससे कम था, मैं इसे नया minValue बनने के लिए सेट कर रहा था। अगर मैंने मिनवाल्लु को मूल रूप से कोई भी घोषित नहीं किया है, तो जाहिर है कि यह अभी भी किसी भी संख्या से कम है, जिसकी मैंने तुलना की थी। मैंने इसे केवल sys.maxint पर शुरू करने के लिए समाप्त किया
TJ Biddle

... वे पहले दायरे में स्वचालित रूप से मौजूद हैं जहां उन्हें सौंपा गया है। तो, आपको उस पहले असाइनमेंट का शिकार करना होगा और उसका पता लगाना होगा। ओह!
एड रान्डेल

56

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

val = None
# ...
if val is None:
   val = any_object

आप val = val or any_objectइसे आरंभ करने के लिए भी लिख सकते हैं ।
ज़ोल्टन

1
@ ज़ोल्टन: यह टूट जाता है यदि वैल के लिए एक वैध मान "झूठा" है जैसे, शून्य या खाली। isयह परखने के लिए उपयोग करें कि क्या कोई मान है None
jfs

आपूर्ति किए गए लिंक पर लेख पढ़ने के बाद, यह शब्दार्थ परिष्कार से थोड़ा अधिक प्रतीत होता है।
एंड्रयू पी।

29

पायथन 3.6+ में आप इसके लिए परिवर्तनीय एनोटेशन का उपयोग कर सकते हैं:

https://www.python.org/dev/peps/pep-0526/#abstract

पीईपी 484 ने टाइप संकेत, उर्फ ​​टाइप एनोटेशन की शुरुआत की। जबकि इसका मुख्य फोकस फ़ंक्शन एनोटेशन था, इसने वेरिएबल्स को एनोटेट करने के लिए टाइप कमेंट्स की धारणा भी पेश की:

# 'captain' is a string (Note: initial value is a problem)
captain = ...  # type: str

PEP 526 का उद्देश्य पायथन के सिंटैक्स को जोड़ने के लिए है, जैसे कि वे वर्णों के प्रकारों को व्यक्त करने के लिए (वर्ग चर और उदाहरण चर सहित), टिप्पणियों के माध्यम से व्यक्त करने के बजाय:

captain: str  # Note: no initial value!

ऐसा लगता है कि आप सीधे पूछ रहे हैं कि क्या "पायथन में कोई मूल्य बताए बिना केवल एक चर घोषित करना संभव है?"


2
उत्कृष्ट उत्तर
बेन

16

मुझे यकीन नहीं है कि आप क्या करने की कोशिश कर रहे हैं। अजगर एक बहुत ही गतिशील भाषा है; जब तक आप वास्तव में उन्हें असाइन करने या उनका उपयोग करने जा रहे हैं, तब तक आपको आमतौर पर चर घोषित करने की आवश्यकता नहीं होती है। मुझे लगता है कि तुम क्या करना चाहते हो बस

foo = None

जो Noneवैरिएबल को मान देगा foo

संपादित करें: जो आप वास्तव में करना चाहते हैं वह सिर्फ यही है:

#note how I don't do *anything* with value here
#we can just start using it right inside the loop

for index in sequence:
   if conditionMet:
       value = index
       break

try:
    doSomething(value)
except NameError:
    print "Didn't find anything"

यह है कि वास्तव में सही शैली इस तरह के एक छोटे से कोड उदाहरण से उपयोग करने के लिए बताने के लिए थोड़ा मुश्किल है, लेकिन यह है एक अधिक "pythonic" कार्यस्थल के रास्ते में।

EDIT: नीचे JFS द्वारा टिप्पणी की गई है (कोड दिखाने के लिए यहां पोस्ट किया गया है)

ओपी के प्रश्न से संबंधित नहीं है, लेकिन उपरोक्त कोड को फिर से लिखा जा सकता है:

for item in sequence:
    if some_condition(item): 
       found = True
       break
else: # no break or len(sequence) == 0
    found = False

if found:
   do_something(item)

नोट: यदि some_condition()कोई अपवाद उठाता है तो foundअनबाउंड है।
नोट: यदि लेन (अनुक्रम) == 0 तो itemअनबाउंड है।

उपरोक्त कोड उचित नहीं है। इसका उद्देश्य यह बताना है कि स्थानीय चर कैसे काम करते हैं, अर्थात् "चर" को "परिभाषित" किया जाता है या नहीं, इस मामले में केवल रनटाइम पर निर्धारित किया जा सकता है। पसंदीदा तरीका:

for item in sequence:
    if some_condition(item):
       do_something(item)
       break

या

found = False
for item in sequence:
    if some_condition(item):
       found = True
       break

if found:
   do_something(item)

क्या एक गतिशील भाषा और बहुत गतिशील भाषा के बीच अंतर है?
गेविन मिलर

प्रोग्रामिंग भाषा टाइपिंग के विभिन्न अक्षों की व्याख्या करने वाला एक शानदार लेख है, और वे कैसे निरंतर हैं, बूलियन मूल्य नहीं; दुर्भाग्य से मैं उस लेख को फिर से कभी नहीं पा सकता जब मैं इसे उद्धृत करना चाहता हूं :( मैं पायथन को "बहुत गतिशील" मानता हूं क्योंकि यह कई अक्षों के दूर के छोर पर है।
kquinn

3

मैं आमतौर पर वेरिएबल को किसी ऐसी चीज से शुरू करता हूं जो टाइप को दर्शाती है

var = ""

या

var = 0

यदि यह एक वस्तु होने जा रही है तो इसे तब तक इनिशियलाइज़ न करें जब तक कि आप इसे तुरंत न कर दें:

var = Var()

3

ठीक है, अगर आप जांचना चाहते हैं कि एक चर परिभाषित किया गया है या नहीं तो स्थानीय या (ग्लोबल्स) में इसकी जांच क्यों नहीं की जाती है? आपका कोड फिर से लिखा गया:

for index in sequence:
   if 'value' not in globals() and conditionMet:
       value = index
       break

यदि यह एक स्थानीय चर है जिसे आप देख रहे हैं तो स्थानीय लोगों के साथ ग्लोबल्स () को बदलें।


2

सबसे पहले, मूल रूप से पूछे गए प्रश्न के बारे में मेरी प्रतिक्रिया

प्रश्न: अगर मेरे कोड में एक चर को परिभाषित किया जाता है तो मुझे कैसे पता चलेगा?

A: स्रोत फ़ाइल में तब तक पढ़ें जब तक आपको एक पंक्ति दिखाई न दे जहां उस चर को परिभाषित किया गया हो।

लेकिन आगे, आपने एक कोड उदाहरण दिया है कि इसके विभिन्न क्रमपरिवर्तन हैं जो कि काफी पाइथोनिक हैं। आप उन तत्वों के लिए एक अनुक्रम स्कैन करने के तरीके के बाद हैं जो किसी स्थिति से मेल खाते हैं, इसलिए यहां कुछ समाधान दिए गए हैं:

def findFirstMatch(sequence):
    for value in sequence:
        if matchCondition(value):
            return value

    raise LookupError("Could not find match in sequence")

स्पष्ट रूप से इस उदाहरण में आप raiseजो कुछ return Noneहासिल करना चाहते थे उसके आधार पर प्रतिस्थापित कर सकते हैं ।

यदि आप वह सब कुछ चाहते हैं जो उस शर्त से मेल खाता हो जो आप यह कर सकते थे:

def findAllMatches(sequence):
    matches = []
    for value in sequence:
        if matchCondition(value):
            matches.append(value)

    return matches

ऐसा करने का एक और तरीका है yieldकि मैं आपको दिखाने में परेशान नहीं करूंगा, क्योंकि यह काम करने के तरीके में काफी जटिल है।

इसके अलावा, इसे प्राप्त करने का एक तरीका है:

all_matches = [value for value in sequence if matchCondition(value)]

2

अगर मैं आपके उदाहरण को सही समझ रहा हूं, तो आपको किसी भी तरह से स्टेटमेंट में 'मान' को संदर्भित करने की आवश्यकता नहीं है। जैसे ही इसे कुछ भी सेट किया जा सकता है आप लूप से बाहर निकल रहे हैं।

value = None
for index in sequence:
   doSomethingHere
   if conditionMet:
       value = index
       break 

1

आपको लगता है कि आप पायथन में C लिखने का प्रयास कर रहे हैं। यदि आप एक क्रम में कुछ खोजना चाहते हैं, तो पायथन ने ऐसा करने के लिए कार्य किए हैं

value = sequence.index(blarg)

1

यह एक अच्छा सवाल है और दुर्भाग्य से खराब उत्तर है जैसा var = Noneकि पहले से ही एक मूल्य प्रदान कर रहा है, और यदि आपकी स्क्रिप्ट कई बार चलती है तो इसे Noneहर बार लिखा जाता है।

यह असाइनमेंट के बिना परिभाषित करने के समान नहीं है। मैं अभी भी यह जानने की कोशिश कर रहा हूं कि इस मुद्दे को कैसे दरकिनार किया जाए।


1

क्या पायथन में एक चर घोषित करना संभव है (var = none):

def decl_var(var=None):
if var is None:
    var = []
var.append(1)
return var

0
var_str = str()
var_int = int()

शरारती शरारती शरारती आदमी! चर प्रकार नहीं जोड़ते हैं, ऑब्जेक्ट करते हैं। var_str को ऐसे सामान्य नाम में विवश नहीं किया जाना चाहिए। यदि आप ऐसा करने जा रहे हैं तो उदाहरण के लिए इसे 'var_age' या 'var_name' की तरह सार्थक बनाएं। इस तरह के मूल्यों को पूर्णांक या तार के रूप में या जो कुछ भी आप चाहते हैं, और वस्तुओं में परिवर्तित किया जा सकता है, वही भावना जो अजगर को अन्य भाषाओं से अलग बनाती है। वे कहते हैं कि यदि आप अपने आप को हर समय ऐसा करने की आवश्यकता पाते हैं, तो आप शायद किसी और भाषा का उपयोग करना चाहते हैं।
ओसिरिसगोथरा

0

यदि Noneएक वैध डेटा मान है तो आपको दूसरे तरीके से चर की आवश्यकता होगी। आप उपयोग कर सकते हैं:

var = object()

यह प्रहरी निक कॉगलन द्वारा सुझाया गया है ।


0

आप इस बदसूरत oneliner के साथ एक दुभाषिया को धोखा दे सकते हैं if None: var = None यह कुछ और नहीं बल्कि एक varस्थानीय चर शब्दकोश में जोड़ रहा है , इसे इनिशियलाइज़ नहीं कर रहा है। यदि आप इस चर को बाद में किसी फ़ंक्शन में उपयोग करने का प्रयास करते हैं, तो इंटरप्रेनर UnboundLocalError अपवाद को फेंक देगा। यह बहुत प्राचीन अजगर संस्करणों के लिए भी काम करेगा। सरल नहीं, और न ही सुंदर, लेकिन अजगर से बहुत उम्मीद न करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.