None 값은 무엇입니까?


130

나는 파이썬을 공부하고 있으며 그 None가치 를 설명하는 장을 읽었 지만 불행히도이 책은 어느 시점에서 명확하지 않습니다. 내 질문에 대한 답변을 공유하면 내 질문에 대한 답을 찾을 것이라고 생각했습니다.

None가치 무엇이며 어떤 용도로 사용하고 싶습니까?

또한, 나는이 부분의 책을 얻지 못했습니다 :

None변수에 값을 할당하면 변수를 원래의 빈 상태로 재설정 할 수 있습니다.

그게 무슨 뜻이야?

컴퓨터 세계에 대한 지식이 부족하여 대부분의 답변을 이해하지 못했지만 답변은 훌륭했습니다 (클래스, 객체 등에 대해 배우지 못했습니다). 이 문장은 무엇을 의미합니까?

None변수에 값을 할당하면 변수를 원래의 빈 상태로 재설정 할 수 있습니다.

결정적인:

마지막으로 다른 답변을 보면서 답변을 얻었습니다. 시간을내어 도와 주신 모든 분들 (특히 Martijn Pieters와 DSM)에게 감사 드리며, 모든 답변을 최고로 선택할 수 있기를 바랍니다. 그러나 선택은 1 명으로 제한됩니다. 모든 답변이 훌륭했습니다.


39
그 책은별로 도움이되지 않습니다. None변수의 기본 빈 상태가 아닙니다.
Martijn Pieters

내 머리 꼭대기에서 PHP는 null 값이 변수의 기본 빈 상태와 동일한 유일한 언어입니다. 이제 다른 언어로하는 것이 궁금합니다.
kojiro

@kojiro perl, 평등 연산자 중 어느 것도에 비교하는 것을 좋아하지 않습니다 undef. 또한 자바 스크립트이지만 null과 를 모두 가지고 있습니다 undefined.
Eevee

undefined초기화되지 않은 경우 @kojiro javascript 변수의 기본값은 입니다.
thefourtheye

인 오른쪽 다양한 에서 null나는 그의 대답에 @MartijnPieters로 만들기 위해 실패 해요 점.
kojiro

답변:


99

Martijn의 답변 None은 파이썬의 내용을 설명 하고 책이 잘못되었다고 올바르게 말합니다. 파이썬 프로그래머는 원칙적으로 말하지 않을 것이기 때문에

None변수에 값을 할당하면 변수를 원래의 빈 상태로 재설정 할 수 있습니다.

Briggs가 의미하는 바를 이해하는 방법을 설명하기가 어렵습니다. 도움이 될 수있는 하나의 유추 :

파이썬에서 변수 이름은 객체에 붙인 스티커와 같습니다. 모든 스티커에는 고유 한 이름이 적혀 있으며 한 번에 하나의 개체에만있을 수 있지만 원하는 경우 같은 개체에 둘 이상의 스티커를 넣을 수 있습니다. 당신이 쓸 때

F = "fork"

스티커 "F"를 문자열 객체에 넣습니다 "fork". 당신이 쓴다면

F = None

스티커를 None개체 로 옮깁니다 .

무엇 브릭스 상상하도록 요구되는 것은 당신이하지 않은 것입니다 쓰기 스티커를 "F", 거기 에 이미F 온 스티커 None, 그리고 당신이 한 모든이었다 이동 에서, 그것을 None"fork". 따라서 입력 할 때 의미 F = None로 취급하기로 결정한 경우 "원래의 빈 상태로 재설정" None됩니다 empty state.

그가 무엇을 얻고 있는지 알 수 있지만, 그것을 보는 것은 나쁜 방법입니다. Python을 시작하고을 입력 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"and A = 2and와 같은 줄로 자신을 작성해야하며 c17 = 3.14나중에 다른 객체에 붙일 수 있습니다 ( F = 10또는 같은 F = None;; 모두 동일합니다) .)

브릭스는 당신이 쓰려고하는 모든 가능한 스티커가 이미 그 None물체에 붙어있는 것처럼 가장하고 있습니다 .


1
죄송합니다. Briggs은 무슨 뜻인가요?이 책의 저자를 언급하고 있나요? 그의 이름은 Jason R. Briggs이기 때문입니다.
The_Diver

@ The_Diver : 네, 그 사람입니다.
DSM

파이썬의 내장 이름에 대한 자세한 정보는 어디에서 찾을 수 있습니까? 감사합니다.
The_Diver

3
이것은 프로그래머가 아닌 사람에게는 훌륭한 설명입니다. 대단히 감사합니다!
Christina

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이 주어 지므로 함수가 인수와 함께 호출되었는지 여부를 쉽게 감지 할 수 있습니다.

다른 언어들도 비슷한 개념을 가지고 있습니다. SQL은 NULL; JavaScript에는 undefined null 등이 있습니다.

파이썬에서는 변수가 사용되기 때문에 존재합니다. 변수를 먼저 선언 할 필요가 없으므로 파이썬 에는 실제로 변수 가 없습니다 . 변수를 None로 설정하는 것은 기본 빈 값으로 설정하는 것과 다릅니다. 비어 있음 None나타내는 데 자주 사용되는 값이지만 값도 있습니다. 당신이 읽고있는 책은 그 시점에서 오해의 소지가 있습니다.


1
공허 의 의미 는 정의되지 않은 것과 다릅니다 . 따라서 JavaScript 및 SQL 상대방이 명확하게 확신하지 못하므로 문제를 혼동시킬 수 있습니다. 자바 스크립트는 모두 가지고 undefined null .
kojiro

@kojiro : undefined는 JavaScript의 객체이므로 NonePython에서 사용할 수있는 것처럼 해당 객체를 명시 적으로 사용할 수 있습니다 . 그것은 거의 같은 의미의 신호 객체입니다.
Martijn Pieters

@kojiro : SQL은 프로그래밍 언어는 아니지만 NULL여전히 명시 적으로 할당하고 테스트 할 수있는 것입니다.
Martijn Pieters

5
@MartijnPieters : SQL 프로그래밍 언어이며 매우 구체적인 목적이며 선언적인 언어입니다.
danielkza

3
@daniel : 프로그래밍 언어로서 오랫동안 논쟁을 벌여 왔던 SQL은 ... 흥미로운 각도에 대해서는 stackoverflow.com/questions/900055/… 를 참조하십시오 .
Martijn Pieters

23

이것은 파이썬 문서 가 말한 것입니다 None.

types.NoneType의 유일한 값입니다. 기본 인수가 함수에 전달되지 않을 때와 같이 없음은 값이 없음을 나타내는 데 자주 사용됩니다.

버전 2.4에서 변경 : 없음으로 할당은 불법이며 SyntaxError가 발생합니다.

참고 None과 디버그 라는 이름은 속성 이름으로도 SyntaxError를 일으켜 할당 할 수 없으므로 "true"상수로 간주 될 수 있습니다.

  1. None먼저 유형을 확인합시다

    print type(None)
    print None.__class__

    산출

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

기본적으로, NoneType단지 같은 데이터 타입 int, float등 당신은 파이썬에서 사용할 수있는 기본 유형의 목록을 확인할 수 있습니다 8.15. types — 내장 유형의 이름 .

  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__아무도 사용하지 않는 것의 의심
Grijesh Chauhan

9

당신이 언급 한 책 은 의 의미 를 크게 단순화 하려고 노력하고 None있습니다. 파이썬 변수는하지 않습니다 초기 빈 상태 - 파이썬 변수가있다 가 정의 할 때 (만) 바인딩 . 값을 지정하지 않으면 Python 변수를 만들 수 없습니다.

>>> 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

다른 답변은 이미 None의 의미를 아름답게 설명했습니다 . 그러나 여전히 예제를 사용하여 더 많은 것을 밝히고 싶습니다.

예:

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']

그런데 왜?

많은 사람들은 extendList가 호출 될 때마다 list 인수가 기본값 [] 로 설정 될 것이라고 생각하면서 list1[10]같고 list3[ 'a' ]같다고 잘못 생각합니다 .

그러나 실제로 발생하는 것은 함수가 정의 될 때 새 기본 목록이 한 번만 작성 되고 목록 인수를 지정하지 않고 extendList가 호출 될 때마다 동일한 목록이 사용됩니다. 함수가 호출 될 때가 아니라 함수가 정의 될 때 기본 인수의 표현식이 계산 되기 때문 입니다.

따라서 list1list3 은 동일한 기본 목록에서 작동하는 반면 list2 는 자신의 빈 목록을 list 매개 변수의 값으로 전달하여 만든 별도의 목록에서 작동합니다.


구세주 '없음': (위에서 예를 수정하여 원하는 동작을 생성하십시오)

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

None은 단일 객체 (하나의 None 만 있음을 의미 함)이며 언어와 라이브러리의 여러 위치에서 다른 값이 없음을 나타내는 데 사용됩니다.


예를 들어 , 사전이있는
경우 d사전 이 있지만 키가없는 경우를 d.get(k)반환 d[k]합니다 .Nonedk

위대한 블로그에서이 정보를 읽으십시오 : http://python-history.blogspot.in/


3

이 모든 것이 좋은 답변이지만 왜 None유용한 지 설명하는 것이 더 있다고 생각 합니다.

결혼식에 RSVP를 수집한다고 상상해보십시오. 각 사람의 참석 여부를 기록하려고합니다. 참석 한 경우을 설정하십시오 person.attending = True. 그들이 참석하지 않으면 설정 person.attending = False합니다. RSVP를받지 못한 경우 person.attending = None. 그렇게하면 정보가없는 None것과 부정적인 대답을 구별 할 수 있습니다 .


1

나는 과일뿐만 아니라 코드 예제도 좋아합니다.

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

없음은 아무것도 의미하지 않으며 가치가 없습니다.

False로 평가되지 않습니다.


8
print(None)인쇄 ... None. 그것은하지 아니 하면, 인쇄 아무것도 제시하지 않기 때문에.
Martijn Pieters

REPL None은 마지막 표현식의 결과 인 경우 에만 아무 것도 표시하지 않습니다 . (이는 대부분 값을 반환하지 않는 함수에 도움이됩니다.)
Eevee

Eugh, 내 실수, 나는 IDLE을 사용하고 있었고 인쇄 된 변수를 가정했는데, 분명히 repl을 사용합니다. 나는 현재 내 자신의 파이썬 / 자바 스크립트 / 코드 읽기 및 이해 기술을 완성하기 위해 SO를 사용하고 있기 때문에 실수를하고 있습니다 :(
Azeirah

2
Python 대화식 인터프리터 프롬프트와 같이 IDLE 은 표현식의 결과 인 경우 대부분 출력을 어지럽히 지 않도록 명시 적으로 숨 깁니다 None .
Martijn Pieters

-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 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.