파이썬에서 변수를 선언 할 수 있습니까?
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")
분명히이 예에서는 당신은 대체 할 수있는 raise
A를을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)]