मूल्य क्या है?


130

मैं पायथन का अध्ययन कर रहा हूं, और मैंने एक अध्याय पढ़ा है जो Noneमूल्य का वर्णन करता है , लेकिन दुर्भाग्य से यह पुस्तक कुछ बिंदुओं पर बहुत स्पष्ट नहीं है। मैंने सोचा था कि मुझे अपने प्रश्न का उत्तर मिल जाएगा, अगर मैं इसे वहां साझा करूं।

मैं जानना चाहता हूं कि Noneमूल्य क्या है और आप इसके लिए क्या उपयोग करते हैं?

और भी, मुझे पुस्तक का यह हिस्सा नहीं मिला:

Noneएक चर का मान असाइन करना इसे अपनी मूल, रिक्त स्थिति में रीसेट करने का एक तरीका है।

इसका क्या मतलब है?

उत्तर बहुत अच्छे थे, हालाँकि मुझे कंप्यूटर की दुनिया के अपने कम ज्ञान के कारण अधिकांश उत्तर समझ में नहीं आए थे (मैंने कक्षाओं, वस्तुओं आदि के बारे में नहीं सीखा है)। इस वाक्य का क्या मतलब है?

Noneएक चर का मान असाइन करना इसे अपनी मूल, रिक्त स्थिति में रीसेट करने का एक तरीका है।

अंतिम:

अंत में मुझे अपना उत्तर अलग-अलग उत्तरों को देखने से मिल गया है। मुझे उन सभी लोगों की सराहना करनी चाहिए, जिन्होंने अपना समय मेरी मदद करने के लिए रखा (विशेषकर मार्टिज़न पीटर और डीएसएम), और मेरी इच्छा है कि मैं सभी उत्तरों को सर्वश्रेष्ठ के रूप में चुन सकूं, लेकिन चयन एक तक सीमित है। सभी के जवाब बड़े अच्छे थे।


39
वह पुस्तक बहुत उपयोगी नहीं है; Noneचर के लिए एक डिफ़ॉल्ट खाली स्थिति नहीं है।
मार्टिन पीटर्स

मेरे सिर के ऊपर से php एकमात्र भाषा है जिसका शून्य मान एक चर के लिए डिफ़ॉल्ट खाली स्थिति के बराबर है। अब मैं सोच रहा हूं कि अन्य भाषाएं क्या करती हैं।
कोजिरो

@kojiro perl, हालांकि दोनों में से कोई भी समानता ऑपरेटरों की तुलना करने के बारे में खुश नहीं है undef। यकीनन जावास्क्रिप्ट भी, हालांकि इसमें दोनों हैं nullऔर undefined
Eevee

@kojiro जावास्क्रिप्ट वैरिएबल का डिफ़ॉल्ट मान है undefined, अगर अनइंस्टॉल किया गया है ।
Thefourtheye

सही है, जो एक बिंदु से अलग है null, मैं उनके जवाब में @MartijnPieters बनाने में विफल रहा हूं।
कोजीरो

जवाबों:


99

मार्टिज़न का जवाब बताता है कि Noneपायथन में क्या है, और सही ढंग से बताता है कि पुस्तक भ्रामक है। एक नियम के रूप में पायथन प्रोग्रामर कभी नहीं कहेंगे

Noneएक चर का मान असाइन करना इसे अपनी मूल, रिक्त स्थिति में रीसेट करने का एक तरीका है।

ब्रिग्स का मतलब एक तरह से समझाना मुश्किल है जो समझ में आता है और बताता है कि यहाँ कोई भी इससे खुश क्यों नहीं है। एक सादृश्य जो मदद कर सकता है:

पायथन में, चर नाम वस्तुओं पर लगाए गए स्टिकर की तरह हैं। हर स्टिकर पर एक अनूठा नाम लिखा होता है, और यह एक समय में केवल एक ही वस्तु पर हो सकता है, लेकिन आप एक ही वस्तु पर एक से अधिक स्टिकर लगा सकते हैं, यदि आप चाहते थे। जब आप लिखते हैं

F = "fork"

आप स्टिकर "F" को एक स्ट्रिंग ऑब्जेक्ट पर रखते हैं "fork"। अगर तुम लिखो तो

F = None

आप स्टिकर को Noneऑब्जेक्ट पर ले जाते हैं।

क्या ब्रिग्स की कल्पना करने के लिए कह रहा है कि तुम नहीं किया है लिखना स्टीकर "F", वहाँ था पहले से ही एक Fपर स्टीकर None, और तुम सब किया था के लिए कदम यह, से Noneकरने के लिए "fork"। जब आप टाइप करते हैं F = None, तो आप "रीसेट [टिंग] इसे अपनी मूल, खाली स्थिति में" करते हैं, अगर हमने Noneअर्थ के रूप में इलाज करने का फैसला किया है empty state

मैं देख सकता हूं कि वह क्या कर रहा है, लेकिन यह देखने का एक बुरा तरीका है। यदि आप पायथन शुरू करते हैं और टाइप करते हैं print(F), तो आप देखते हैं

>>> print(F)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'F' is not defined

और NameErrorइसका मतलब है कि पायथन नाम को नहीं पहचानता F, क्योंकि ऐसा कोई स्टिकर नहीं है । यदि ब्रिग्स सही और थे F = Noneफिर सेट करता है Fउसकी मूल स्थिति में है, तो यह अब वहाँ होना चाहिए, और हम देखना चाहिए

>>> print(F)
None

जैसे हम करते हैं उसके बाद हम टाइप करते हैं F = Noneऔर स्टिकर लगाते हैं None


तो बस इतना ही चल रहा है। हकीकत में, अजगर कुछ स्टिकर पहले से ही वस्तुओं (नाम में निर्मित) से जुड़ी के साथ आता है, लेकिन दूसरों आप अपने आप को जैसे लाइनों के साथ लिखने के लिए है F = "fork"और A = 2और c17 = 3.14, और फिर आप बाद में जैसे अन्य वस्तुओं पर उन्हें छड़ी कर सकते हैं ( F = 10या F = None, यह सब एक ही है ।)

ब्रिग्स यह दिखावा कर रहा है कि आपके द्वारा लिखे जाने वाले सभी संभावित स्टिकर पहले से ही Noneऑब्जेक्ट से चिपके हुए हैं ।


1
क्षमा करें, लेकिन आपका क्या मतलब है ब्रिग्स? क्या आप इस पुस्तक के लेखक की बात कर रहे हैं? क्योंकि उनका नाम जेसन आर। ब्रिग्स है।
the_Diver

@The_Diver: हाँ, वह उसे है।
DSM

मैं पायथन के निर्मित नामों के बारे में अधिक जानकारी कहां पा सकता हूं? धन्यवाद।
TheDiver

3
यह एक गैर-प्रोग्रामर के लिए एक महान व्याख्या है। आपका बहुत बहुत धन्यवाद!
क्रिस्टीना

67

Noneकेवल एक मूल्य है जो आमतौर पर 'खाली', या 'यहाँ कोई मूल्य नहीं' को सूचित करने के लिए उपयोग किया जाता है। यह एक संकेत वस्तु है ; इसका केवल अर्थ है क्योंकि पायथन प्रलेखन कहता है कि इसका अर्थ है।

किसी दिए गए पायथन दुभाषिया सत्र में उस वस्तु की केवल एक प्रति है।

यदि आप एक फ़ंक्शन लिखते हैं, और वह फ़ंक्शन स्पष्ट returnविवरण का उपयोग नहीं करता Noneहै, तो उदाहरण के लिए, वापस कर दिया जाता है। इस तरह, कार्यों के साथ प्रोग्रामिंग बहुत सरलीकृत है; एक फ़ंक्शन हमेशा कुछ देता है , भले ही वह केवल एक Noneवस्तु हो।

आप स्पष्ट रूप से इसके लिए परीक्षण कर सकते हैं:

if foo is None:
    # foo is set to None

if bar is not None:
    # bar is set to something *other* than None

एक अन्य उपयोग कार्यों को 'खाली' डिफ़ॉल्ट करने के लिए वैकल्पिक पैरामीटर देने के लिए है:

def spam(foo=None):
    if foo is not None:
        # foo was specified, do something clever!

फ़ंक्शन spam()का एक वैकल्पिक तर्क है; यदि आप spam()इसे निर्दिष्ट किए बिना कॉल करते हैं, तो डिफ़ॉल्ट मान Noneइसे दिया जाता है, जिससे यह पता लगाना आसान हो जाता है कि फ़ंक्शन को एक तर्क के साथ बुलाया गया था या नहीं।

अन्य भाषाओं में समान अवधारणाएँ हैं। एसक्यूएल है NULL; जावास्क्रिप्ट है undefined और null , आदि।

ध्यान दें कि पायथन में, चर उपयोग किए जाने के आधार पर मौजूद हैं। आपको पहले एक चर घोषित करने की आवश्यकता नहीं है, इसलिए पायथन में वास्तव में खाली चर नहीं हैं । एक चर की स्थापना Noneतब एक डिफ़ॉल्ट खाली मान पर सेट करने के समान नहीं है; Noneएक मूल्य भी एक है कि अक्सर करने के लिए इस्तेमाल यद्यपि है, संकेत emptyness। आप जो किताब पढ़ रहे हैं, वह उस बिंदु पर भ्रामक है।


1
मुझे लगता है कि शून्यता के शब्दार्थ अपरिभाषित लोगों से अलग हैं । इसलिए मुझे यकीन नहीं है कि जावास्क्रिप्ट और एसक्यूएल समकक्ष स्पष्ट कर रहे हैं - वे समस्या को भ्रमित कर सकते हैं। जावास्क्रिप्ट दोनों undefined और है null
कोजिरो

@kojiro: undefinedजावास्क्रिप्ट में एक वस्तु है, और आप उस वस्तु का स्पष्ट रूप से उपयोग कर सकते हैं जैसे आप Noneपायथन में उपयोग कर सकते हैं । यह एक संकेत वस्तु है, जिसका एक ही अर्थ है।
मार्टिन पीटर्स

@ कोकोजी: एसक्यूएल एक प्रोग्रामिंग भाषा नहीं है, लेकिन NULLअभी भी कुछ ऐसा है जिसे स्पष्ट रूप से सौंपा और परीक्षण किया जा सकता है।
मार्टिन पीटर्स

5
@MartijnPieters: एसक्यूएल है एक प्रोग्रामिंग भाषा है, बस एक बहुत विशिष्ट प्रयोजन, कथात्मक एक।
danielkza

3
@daniel: wether SQL एक प्रोग्रामिंग भाषा के रूप में अर्हता प्राप्त करता है, जो एक लंबी बहस रही है ... दिलचस्प कोणों के लिए stackoverflow.com/questions/900055/… देखें ।
मार्टिन पीटर्स

23

यह क्या है अजगर प्रलेखन के बारे में कहने के लिए मिल गया है None:

Type.NoneType का एकमात्र मान। कोई भी अक्सर मूल्य की अनुपस्थिति का प्रतिनिधित्व करने के लिए उपयोग नहीं किया जाता है, जब किसी फ़ंक्शन को डिफ़ॉल्ट तर्क पास नहीं किया जाता है।

संस्करण 2.4 में परिवर्तित: कोई भी असाइनमेंट अवैध नहीं हैं और एक सिंटैक्सएयर उठाएँ।

नोट कोई भी नाम और डीबग पुन: असाइन नहीं किया जा सकता है (उनके लिए असाइनमेंट, यहां तक ​​कि एक विशेषता नाम के रूप में, सिंटैक्सएयर को बढ़ाएं), इसलिए उन्हें "सही" स्थिरांक माना जा सकता है।

  1. चलो Noneपहले प्रकार की पुष्टि करते हैं

    print type(None)
    print None.__class__

    उत्पादन

    <type 'NoneType'>
    <type 'NoneType'>

मूल रूप से, NoneTypeठीक वैसे ही जैसा एक डेटा प्रकार है int, floatआदि शामिल हो सकते में अजगर में उपलब्ध डिफ़ॉल्ट प्रकार की सूची की जांच कर सकते 8.15। प्रकार - अंतर्निहित प्रकार के लिए नाम

  1. और, कक्षा Noneका एक उदाहरण है NoneType। इसलिए हम Noneस्वयं के उदाहरण बनाना चाहते हैं। चलो कोशिश करते हैं कि

    print types.IntType()
    print types.NoneType()

    उत्पादन

    0
    TypeError: cannot create 'NoneType' instances

तो स्पष्ट रूप से, NoneTypeउदाहरण नहीं बना सकते । हमें मूल्य की विशिष्टता के बारे में चिंता करने की ज़रूरत नहीं है None

  1. आइए देखें कि हमने Noneआंतरिक रूप से कैसे लागू किया है ।

    print dir(None)

    उत्पादन

    ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', 
     '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__',
     '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

को छोड़कर __setattr__, अन्य सभी केवल-पढ़ने के लिए विशेषता हैं। इसलिए, ऐसा कोई तरीका नहीं है जिससे हम विशेषताओं को बदल सकें None

  1. आइए कोशिश करते हैं और नई विशेषताओं को जोड़ते हैं None

    setattr(types.NoneType, 'somefield', 'somevalue')
    setattr(None, 'somefield', 'somevalue')
    None.somefield = 'somevalue'

    उत्पादन

    TypeError: can't set attributes of built-in/extension type 'NoneType'
    AttributeError: 'NoneType' object has no attribute 'somefield'
    AttributeError: 'NoneType' object has no attribute 'somefield'

उपरोक्त देखे गए कथन क्रमशः ये त्रुटि संदेश उत्पन्न करते हैं। इसका अर्थ है कि, हम Noneउदाहरण पर गतिशील रूप से विशेषताएँ नहीं बना सकते ।

  1. आइए देखें कि जब हम कुछ असाइन करते हैं तो क्या होता है None। प्रलेखन के अनुसार, इसे फेंक देना चाहिए SyntaxError। इसका मतलब है, अगर हम कुछ को असाइन करते हैं None, तो प्रोग्राम को बिल्कुल भी निष्पादित नहीं किया जाएगा।

    None = 1

    उत्पादन

    SyntaxError: cannot assign to None

हमने वह स्थापित किया है

  1. None का एक उदाहरण है NoneType
  2. None नए गुण नहीं हो सकते
  3. मौजूदा विशेषताओं को Noneनहीं बदला जा सकता है।
  4. हम अन्य उदाहरण नहीं बना सकते हैं NoneType
  5. हम Noneइसे मान निर्दिष्ट करके संदर्भ भी नहीं बदल सकते हैं ।

इसलिए, जैसा कि प्रलेखन में उल्लेख किया गया है, Noneवास्तव में एक के रूप में माना जा सकता है true constant

हैप्पी जानना None:)


बहुत ही रोचक !! एक संदेह है कि __setattr__कोई नहीं के लिए क्या उपयोग है
बृजेश चौहान

9

जिस पुस्तक का आप उल्लेख करते हैं वह स्पष्ट रूप से के अर्थ को बहुत सरल बनाने की कोशिश कर रही है None। अजगर चर नहीं है है एक प्रारंभिक, खाली राज्य - अजगर चर रहे हैं बाध्य (केवल) जब वे परिभाषित कर रहे हैं । आप इसे मूल्य दिए बिना पायथन वेरिएबल नहीं बना सकते।

>>> print(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> def test(x):
...   print(x)
... 
>>> test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: test() takes exactly 1 argument (0 given)
>>> def test():
...   print(x)
... 
>>> test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in test
NameError: global name 'x' is not defined

लेकिन कभी-कभी आप एक फ़ंक्शन का मतलब अलग-अलग चीजों से बनाना चाहते हैं जो इस बात पर निर्भर करता है कि एक चर परिभाषित किया गया है या नहीं। आप डिफ़ॉल्ट मान के साथ एक तर्क बना सकते हैं None:

>>> def test(x=None):
...   if x is None:
...     print('no x here')
...   else:
...     print(x)
... 
>>> test()
no x here
>>> test('x!')
x!

तथ्य यह है कि यह मान विशेष Noneमूल्य है इस मामले में बहुत महत्वपूर्ण नहीं है। मैं किसी भी डिफ़ॉल्ट मान का उपयोग कर सकता था:

>>> def test(x=-1):
...   if x == -1:
...     print('no x here')
...   else:
...     print(x)
... 
>>> test()
no x here
>>> test('x!')
x!

... लेकिन Noneआसपास होने से हमें दो लाभ मिलते हैं:

  1. हमें कोई विशेष मूल्य नहीं चुनना है, -1जिसका अर्थ अस्पष्ट है, और
  2. हमारे कार्य को वास्तव -1में एक सामान्य इनपुट के रूप में संभालने की आवश्यकता हो सकती है ।
>>> test(-1)
no x here

उफ़!

इसलिए पुस्तक थोड़ी सी भ्रामक है, जिसमें ज्यादातर शब्द रीसेट का उपयोग किया जाता है - Noneएक नाम को निर्दिष्ट करना एक प्रोग्रामर को संकेत है कि उस मूल्य का उपयोग नहीं किया जा रहा है या फ़ंक्शन को कुछ डिफ़ॉल्ट तरीके से व्यवहार करना चाहिए, लेकिन एक मूल्य को रीसेट करने के लिए इसकी मूल, अपरिभाषित स्थिति के लिए आपको delकीवर्ड का उपयोग करना होगा :

>>> x = 3
>>> x
3
>>> del x
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

5

अन्य उत्तरों ने पहले से ही सुंदर रूप से किसी का अर्थ नहीं समझाया है । हालांकि, मैं अभी भी एक उदाहरण का उपयोग करके इस पर अधिक प्रकाश डालना चाहूंगा।

उदाहरण:

def extendList(val, list=[]):
    list.append(val)
    return list

list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')

print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3

अब उपरोक्त सूची के आउटपुट का अनुमान लगाने की कोशिश करें। खैर, जवाब आश्चर्यजनक रूप से नीचे दिया गया है:

list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']

लेकिन क्यों?

कई गलती से उम्मीद करेंगे List1 के बराबर होना चाहिए [10] और सूची 3 के बराबर होना [ 'एक'] , सोच सूची तर्क की अपनी डिफ़ॉल्ट मान पर सेट हो जाएगा कि [] हर बार extendList कहा जाता है।

हालाँकि, वास्तव में ऐसा होता है कि नई डिफ़ॉल्ट सूची केवल एक बार बनाई जाती है जब फ़ंक्शन को परिभाषित किया जाता है , और उसी सूची का उपयोग तब किया जाता है जब भी सूची सूची निर्दिष्ट किए बिना विस्तारक का उपयोग किया जाता है। ऐसा इसलिए है क्योंकि फ़ंक्शन को परिभाषित करने पर डिफ़ॉल्ट तर्कों में अभिव्यक्तियों की गणना की जाती है, जब इसे कॉल नहीं किया जाता है

लिस्ट 1 और लिस्ट 3 इसलिए एक ही डिफॉल्ट लिस्ट पर काम कर रहे हैं, जबकि लिस्ट 2 एक अलग लिस्ट पर काम कर रही है , जो उसने बनाई (लिस्ट पैरामीटर के मान के तौर पर अपनी खाली लिस्ट पास करके)।


: कोई नहीं ’उद्धारकर्ता: (वांछित व्यवहार उत्पन्न करने के लिए ऊपर का उदाहरण बदलें)

def extendList(val, list=None):
    if list is None:
       list = []
    list.append(val)
    return list

list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')

print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3

इस संशोधित कार्यान्वयन के साथ, आउटपुट होगा:

list1 = [10]
list2 = [123]
list3 = ['a']

नोट - उदाहरण का श्रेय toptal.com को है


3

कोई भी एक सिंगलटन ऑब्जेक्ट नहीं है (जिसका अर्थ है कि कोई एक ही है), भाषा और पुस्तकालय में कई स्थानों पर उपयोग किया जाता है ताकि कुछ अन्य मूल्य की अनुपस्थिति का प्रतिनिधित्व किया जा सके।


उदाहरण के लिए:
यदि dकोई शब्दकोष है, तो मौजूद होने पर d.get(k)वापस आ जाएगा d[k], लेकिन Noneयदि dउसके पास कोई कुंजी नहीं है k

इस जानकारी को एक महान ब्लॉग से पढ़ें: http://python-history.blogspot.in/


3

ये सभी अच्छे उत्तर हैं, लेकिन मुझे लगता है कि Noneयह समझाने के लिए अधिक है कि क्यों उपयोगी है।

कल्पना कीजिए कि आप एक शादी के लिए आरएसवीपी इकट्ठा कर रहे हैं। आप रिकॉर्ड करना चाहते हैं कि क्या प्रत्येक व्यक्ति उपस्थित होगा। यदि वे भाग ले रहे हैं, तो आप सेट करें person.attending = True। यदि वे आपके सेट पर उपस्थित नहीं होते हैं person.attending = False। यदि आपको कोई आरएसवीपी नहीं मिला है, तो person.attending = None। इस तरह आप बिना किसी सूचना के None- और एक नकारात्मक उत्तर के बीच अंतर कर सकते हैं ।


1

मुझे कोड उदाहरण (साथ ही फल) पसंद हैं, इसलिए मुझे आपको दिखाना चाहिए

apple = "apple"
print(apple)
>>> apple
apple = None
print(apple)
>>> None

किसी का कोई मतलब नहीं, उसका कोई मूल्य नहीं है।

कोई भी व्यक्ति फाल्स का मूल्यांकन नहीं करता है।


8
print(None)प्रिंट .. None। यह नहीं है , जैसा कि आप सुझाव देते हैं, कुछ भी नहीं प्रिंट करें।
मार्टिन पीटर्स

REPL केवल कुछ नहीं दिखाता है Noneयदि यह अंतिम अभिव्यक्ति का परिणाम है। (जो अधिकतर मानों को वापस करने के इरादे से किए जाने वाले कार्यों के लिए सहायक होता है।)
ईवे

Eugh, मेरी गलती, मैं IDLE का उपयोग कर रहा था और मैंने इसे मुद्रित चर मान लिया था, जाहिर है यह उत्तर का उपयोग करता है। मैं वर्तमान में SO का उपयोग अपने स्वयं के अजगर / जावास्क्रिप्ट / कोड पढ़ने और समझने के कौशल को पूर्ण करने के लिए कर रहा हूं, इसलिए मैं कुछ गलतियाँ कर रहा हूं:
Azeirah

2
आइडल, पायथन इंटरएक्टिव इंटरप्रेटर प्रॉम्प्ट की तरह, स्पष्ट रूप से छुपाता है None यदि यह एक अभिव्यक्ति का परिणाम है, तो ज्यादातर आउटपुट को अव्यवस्थित नहीं करना है।
मार्टिन पीटर्स

-5
largest=none
smallest =none 
While True :
          num =raw_input ('enter a number ') 
          if num =="done ": break 
          try :
           inp =int (inp) 
          except:
              Print'Invalid input' 
           if largest is none :
               largest=inp
           elif inp>largest:
                largest =none 
           print 'maximum', largest

          if smallest is none:
               smallest =none
          elif inp<smallest :
               smallest =inp
          print 'minimum', smallest 

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