for 루프에서 사용하지 않는 변수를 선언하는 방법은 무엇입니까?


87

다음과 같은 목록 이해력 (예 :)이있는 경우 :

['' for x in myList]

목록의 모든 요소에 대해 빈 문자열이있는 새 목록을 효과적으로 만들려면 x. 사용하지 않는 x변수 를 선언 할 필요가 없도록 이것을 작성하는 더 깨끗한 방법이 있습니까?

답변:


130

_ for 루프 및 튜플 할당에서 무시 된 멤버의 표준 자리 표시 자 이름입니다. 예 :

['' for _ in myList]

[a+d for a, _, _, d, _ in fiveTuples]

BTW 목록은 목록 이해없이 작성 될 수 있습니다 (문자열, 정수 등과 같은 불변 멤버 목록을 만들고 싶다고 가정).

[''] * len(myList)

10
후자는 변경 가능한 객체에 대해 예상 한 작업을 수행하지 않는다는 큰 경고를 동반해야합니다.

5
@Mohit :a=[[]]*4;a[0].append(5);print(a)
kennytm 2011 년

@Ramy : Mohit이 설명을 게시했지만 삭제되었습니다. : S 어쨌든 docs.python.org/py3k/library/… 에서 Notes 2를 확인하십시오 .
kennytm 2011 년

2
@Ramy, Python은 메모리의 동일한 객체에 대해 동일한 참조를 유지합니다.
Mohit Ranka 2011 년

for예를 들어 중첩 루프를 수행하는 것이 중요합니까 ? 아니면 for _ in range(...)내가 말하고 싶다면 _, var = f(x)? 두 _변수 가 혼동 될까요?
Eric Auld

19

아니요. Zen이 말했듯이 특별한 경우는 규칙을 위반할만큼 특별하지 않습니다. 반복되는 항목의 항목을 사용하지 않는 루프와 압축을 풀 "대상"이 있다는 규칙이 특별한 경우입니다.

그러나 _일반적으로 "의도적으로 사용되지 않은"것으로 이해되는 변수 이름으로 사용할 수 있습니다 (PyLint 등도이를 알고 존중합니다).


PyLint 그러나 불평 C: 10,24: Invalid variable name "_" (invalid-name)당신이에 추가하지 않는 한 good-names당신에 .pylintrc.
giorgiosironi

12

그것은 사용 밝혀 dummy*변수 이름과 같은 트릭 마찬가지로 (시작 워드 더미이다) _. _알려진 표준이며 의미있는 변수 이름을 사용하는 것이 좋습니다. 당신이 사용할 수 있도록 dummy, dummy1, dummy_anything. 이러한 변수 이름을 사용하면 PyLint불평하지 않습니다.


나는 정말로이 접근법을 선호한다. 의미가 남아 있습니다.
RvdK

2

같은 줄의 for 루프 뒤에 다음 주석을 추가합니다.

#pylint : disable = unused-variable

for i in range(100): #pylint: disable=unused-variable

1

인수의 이름을 지정해야하는 경우 (예 : 이름으로 참조되는 특정 인수를 사용하지 않는 모의를 작성할 때) 다음 단축 메서드를 추가 할 수 있습니다.

def UnusedArgument(_):
  pass

다음과 같이 사용하십시오

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)

0

생성기 객체는 실제로 변수를 사용하지 않습니다. 그래서 뭔가

list(('' for x in myList))

트릭을해야합니다. x는 생성기 이해도 외부의 변수로 정의되지 않습니다.


0

_변수에 사람이 읽을 수있는 이름을 지정하려는 경우 변수 이름 앞에 추가 할 수도 있습니다 . 예를 들어, 당신은 사용할 수 있습니다 _foo, _foo1, _anything및 PyLint 불평하지 않습니다. for 루프에서는 다음과 같습니다.

for _something in range(10):
    do_something_else()

편집 : 예제 추가


0

자세한 방법은 다음과 같습니다.

newList = []
while len(newList) < len(mylist):
    newList.append('')

이런 식으로 사용 된 변수를 선언하지 않습니다.

또한 딕셔너리와 같은 변경 가능한 객체와 변경 불가능한 객체를 모두 추가 할 수 있습니다 newList.

나 같은 파이썬 초보자에게 또 다른 것은 '_', 'dummy'가 조금 당황 스럽습니다.


0

시도해보세요. 간단합니다.

# Use '_' instead of the variable
for _ in range(any_number):
    do_somthing()

-1

의견 내가 for 루프에 사용되지 않은 변수를 선언 주위를 얻을 수있는 방법은? (댓글 크기의 란)

파이썬은 생성 된 객체에 대해 동일한 참조를 유지합니다. (가변성에 관계없이) 예를 들어,

In [1]: i = 1

In [2]: j = 1

In [3]: id(i)
Out[3]: 142671248

In [4]: id(j)
Out[4]: 142671248

i와 j 모두 메모리에서 동일한 객체를 참조하는 것을 볼 수 있습니다. 하나의 불변 변수 값을 변경하면 어떻게됩니까?

In [5]: j = j+1

In [6]: id(i)
Out[6]: 142671248

In [7]: id(j)
Out[7]: 142671236

이제 j가 새 위치 (2가 저장된 위치)를 가리 키기 시작하고 i는 여전히 1이 저장된 위치를 가리 킵니다. 평가하는 동안

j = j+1

값은 142671248에서 선택되고 계산되어 (아직 캐시되지 않은 경우) 새 위치 142671236에 배치됩니다. j는 새 위치를 가리 키도록 만들어집니다. 간단히 말해서 불변 변수가 수정 될 때마다 새 복사본이 만들어집니다.

가변성

이와 관련하여 변경 가능한 객체는 거의 다르게 작동합니다. 값이 가리키는 경우

In [16]: a = []

In [17]: b = a

In [18]: id(a)
Out[18]: 3071546412L

In [19]: id(b)
Out[19]: 3071546412L

a와 b는 모두 동일한 메모리 위치를 가리 킵니다.

In [20]: a.append(5)

a가 가리키는 메모리 위치가 수정됩니다.

In [21]: a
Out[21]: [5]

In [22]: b
Out[22]: [5]

In [23]: id(a)
Out[23]: 3071546412L

In [24]: id(b)
Out[24]: 3071546412L

a와 b 모두 여전히 동일한 메모리 위치를 가리 킵니다. 즉, 변경 가능한 변수는 변경 불가능한 변수의 경우와 같이 변수가 가리키는 값의 복사본을 만드는 대신 변수가 가리키는 동일한 메모리 위치에서 작동합니다.


이것에 대해 감사하지만 질문과 무슨 관련이 있는지 잘 모르겠습니다. (아니, 난 downvote하지 않았다)
Ramy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.