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


288

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

var

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

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

value

for index in sequence:

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

복제

관련


1
이 작은 프로그램을 게시 할 수 있습니다.
Preet Sangha

중복 질문을 게시하여 다른 질문에 찬성하여이 질문을 닫기로 투표했습니다.
Jerub

여전히 약간의 차이가 있습니다. 이것은 선언만으로 변수를 사용할 수 없다는 것을 처리합니다.
Joan Venge

첫 번째 질문에서 설명하는 것처럼 파이썬 세계에서 변수를 선언하는 것과 같은 것은 없습니다.
Harley Holcombe

1
변수에 기간이 할당되기 전에는 존재하지 않기 때문에 '단지 할당'이라고 말한 사람이없는 이유 그리고 파이썬의 변수에는 유형 정보가 포함되어 있지 않습니다. 객체가 그렇게합니다. 변수는 그 시점에서 객체를 유지하기위한 것입니다. 또한 위의 프로그램은 첫 번째 줄에 NameError 예외를 발생시켜야합니다. (2.X와 3.X에서 모두 얻는 것)
osirisgothra

답변:


359

왜 이렇게하지 않습니까?

var = None

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

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


1
나는 그렇게 할 것이지만 암묵적으로 그렇게 할 것이라고 생각했습니다.
Joan Venge

7
요점은 이것이 암시 적이 아니라 명시 적이어야한다는 것입니다. 초기 값이 무엇인지 추측하지 않습니다. 초기화되지 않은 변수가 예외를 던지거나 마술처럼 유용한 가치가 있는지 궁금합니다.
S.Lott

2
내가 가진 문제는 카운터 (minValue)를 추적하고 있었고 값이 그보다 낮을 때마다 새로운 minValue가되도록 설정하는 것이 었습니다. 원래 minValue를 None으로 선언했다면 분명히 비교 한 숫자보다 낮습니다. 나는 단지 그것을 sys.maxint에서 초기화하는 것을 끝내었다
TJ Biddle

... 그들은 할당 된 첫 번째 범위에 자동으로 존재합니다. 첫 번째 과제를 찾아서 알아 내야합니다. 우와!
Ed Randall

56

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

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

val = val or any_object초기화를 위해 쓸 수도 있습니다 .
Zoltán

1
@ Zoltán : val에 유효한 값이 "false"이면 (예 : 0 또는 비어 있음) 중단됩니다. is값이인지 테스트하는 데 사용 합니다 None.
jfs

제공된 링크에서 기사를 읽은 후에는 의미 론적 궤변에 지나지 않습니다.
Andrew P.

29

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!

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


2
탁월한 답변
Ben

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"

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

편집 : 아래는 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)

동적 인 언어와 매우 동적 인 언어 사이에 차이가 있습니까?
Gavin Miller

프로그래밍 언어 타이핑의 다른 축과 부울 값이 아닌 연속체의 방식을 설명하는 훌륭한 기사가 있습니다. 나는 그것을 인용 할 때 불행하게도 나는 다시 그 기사를 찾을 수 없다 :(는 여러 축의 맨 끝에 때문에 나는 "매우 역동적"파이썬을 고려하십시오.
kquinn

3

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

var = ""

또는

var = 0

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

var = Var()

3

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

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

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


2

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

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

2

귀하의 예를 올바르게 이해하고 있다면 어쨌든 if 문에서 'value'를 참조 할 필요가 없습니다. 어떤 것이 든 설정하자마자 루프에서 빠져 나옵니다.

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'과 같이 의미가 있습니다. 이러한 값은 정수 또는 문자열 또는 원하는대로 취할 수 있으며 파이썬을 다른 언어와 다르게 만드는 정신으로 객체로 변경 될 수 있습니다. 그들은 당신이 항상이 일을해야한다면, 다른 언어를 사용하고 싶을 수도 있다고 말합니다.
osirisgothra

0

None유효한 데이터 값인 경우 다른 방법으로 변수를 사용해야합니다. 당신은 사용할 수 있습니다 :

var = object()

이 센티넬은 Nick Coghlan 이 제안합니다 .


0

이 추악한 oneliner로 인터프리터를 속일 수 있습니다 . 초기화하지 않고 로컬 변수 사전에 if None: var = None 변수 var를 추가하는 것 외에는 아무것도하지 않습니다 . 나중에 함수에서이 변수를 사용하려고하면 인터프리터에서 UnboundLocalError 예외가 발생합니다. 이것은 매우 오래된 파이썬 버전에서도 작동합니다. 단순하지도 않고 아름답지는 않지만 파이썬에서 많이 기대하지는 않습니다.

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