[python] 파이썬에서 값을 할당하지 않고 변수를 선언하는 것이 가능합니까?

파이썬에서 변수를 선언 할 수 있습니까?

var

None으로 초기화되도록? 파이썬에서 허용하는 것처럼 보이지만 액세스하면 충돌이 발생합니다. 이게 가능해? 그렇지 않다면 왜?

편집 : 나는 다음과 같은 경우에 이것을하고 싶다 :

value

for index in sequence:

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

복제

관련



답변

왜 이렇게하지 않습니까?

var = None

파이썬은 동적이기 때문에 선언 할 필요가 없습니다. 할당 된 첫 번째 범위에 자동으로 존재합니다. 따라서 위와 같이 일반적인 이전 할당 문 만 있으면됩니다.

초기화되지 않은 변수로 끝나지 않기 때문에 이것은 좋습니다. 그러나 조심하십시오-이것이 잘못 초기화 된 변수로 끝나지 않는다는 것을 의미하지는 않습니다 . 에 무언가를 초기화하는 경우 None실제로 원하는 것을 확인하고 가능하면 더 의미있는 것을 할당하십시오.


답변

나는 진심으로 당신이 읽을 것을 권 해드립니다 다른 언어는 “변수”가 2 분 파이썬은 “이름”이 아니라 “변수”가 있음을 알 수를 – (나는 관련 링크로 추가).

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


답변

Python 3.6 이상에서는 변수 주석을 사용할 수 있습니다.

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

PEP 484는 타입 힌트, 일명 타입 주석을 도입했습니다. 주요 초점은 함수 주석이지만 변수 주석을 달기 위해 형식 주석 개념을 도입했습니다.

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

PEP 526은 주석을 통해 표현하는 대신 변수 유형 (클래스 변수 및 인스턴스 변수 포함)에 주석을 달기 위해 Python에 구문을 추가하는 것을 목표로합니다.

captain: str  # Note: no initial value!

“파이썬에서 값을 할당하지 않고 변수를 선언하는 것만 가능합니까?”


답변

당신이 무엇을하려고하는지 잘 모르겠습니다. 파이썬은 매우 역동적 인 언어입니다. 실제로 변수를 할당하거나 사용할 때까지 변수를 선언 할 필요는 없습니다. 당신이하고 싶은 것은 단지

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"

그것은 그 정말 짧은 코드 예제에서 사용할 수있는 권리 스타일을인지 말할 조금 어려운, 그러나 입니다 작업에 더 “파이썬”방법.

편집 : 아래는 JFS의 의견입니다 (코드를 표시하기 위해 게시 됨)

OP의 질문과 관련이 없지만 위의 코드는 다음과 같이 다시 작성할 수 있습니다.

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가 발생하면 바인딩되지 않습니다.
참고 : len (sequence) == 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)


답변

나는 보통 변수를 다음과 같은 유형을 나타내는 것으로 초기화합니다

var = ""

또는

var = 0

객체가 될 경우 인스턴스화 할 때까지 초기화하지 마십시오.

var = Var()


답변

글쎄, 변수가 정의되어 있는지 확인하고 싶다면 locals () 또는 globals () 배열에서 변수를 검사하지 않는 이유는 무엇입니까? 코드가 다시 작성되었습니다.

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

지역 변수 인 경우 globals ()를 locals ()로 바꿉니다.


답변

우선, 당신이 처음에 질문 한 것에 대한 나의 반응

Q : 코드에서 특정 시점에 변수가 정의되어 있는지 어떻게 알 수 있습니까?

A : 해당 변수가 정의 된 줄이 보일 때까지 소스 파일을 읽으십시오.

그러나 또한, 당신은 꽤 파이썬적인 다양한 순열이 있다는 코드 예제를 제공했습니다. 조건과 일치하는 요소를 순서대로 스캔하는 방법을 찾았으므로 다음과 같은 해결책이 있습니다.

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

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

분명히이 예에서는 당신은 대체 할 수있는 raiseA를을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)]