2016-11-21 2 views
1

도시 목록을 변수로 전달하면 작업이 예상대로 완료됩니다.Python - 인수를 명확하게 전달

def count_top_rt(tweet_set): 
    for tweet in tweet_set: 
     print(tweet) 

tweet_set = ["Sydney", "London", "Paris"] 
print(tweet_set) 

I를 잘못 입력하면 함수 정의에서 인수 이름은 다음 여전히 전체 작업의 tweet_set 변수는 글로벌 때문이다.

def count_top_rt(mis_typed_arguament): 
    for tweet in tweet_set: 
     print(tweet) 

tweet_set = ["Sydney", "London", "Paris"] 
print(tweet_set) 

제대로 인수를 전달하지 않는 것이 잘못되었습니다. 두 가지 질문이 있습니다.

  • 첫 번째 버전에서는 인수가 '제대로 전달'되었습니까?
  • 인수를 올바르게 전달할 수있는 방법은 무엇입니까?
+5

로컬 변수에 사용하는 것과 같은 이름을 전역 변수에 사용하지 마십시오. 그렇다면이 문제는 결코 발생하지 않습니다. – kindall

+0

PyCharm 또는 유사한 IDE를 사용하면 자동으로이 작업을 수행 할 때 알려줍니다. – Alex

+1

@kindall 두 번째 함수의 문제는 전역 변수와 지역 변수에 동일한 이름을 사용하는 것이 아니라 'for' 루프가 해당 지역 변수를 사용하지 않는다는 것입니다. – Barmar

답변

3

인수가 '제대로 전달'되었습니까?

예, 인수는 첫 번째 예에서 올바르게 전달됩니다. 루틴은 입력 매개 변수에만 의존합니다.

당신은 효과적으로이 문제에 대해 보호하지 수있는 방법 모듈 철학에서

무엇이다 : 당신의 기능을하지 외부 아무것도에 대해 알고을 허용합니다. 이것은 "순수한"모듈 식 프로그래밍과 Python의 기능이 조금 다른 점입니다.

프로그래머는 충돌을 일으키지 않는 변수 이름을 사용하는 것이 좋습니다. 이 경우 테스트 드라이버 (주 프로그램)에서 tweet_set의 이름을 의 이름을 다른 이름으로 변경하십시오. 테스트 사례 인 경우 TEST_DRIVER_tweet_set과 같은 함수에 표시되지 않는 이름을 사용하십시오.

프로그래밍 관행

는 각 이름의 모든 항목을 강조 편집기의 검색 기능을 사용할 수 있습니다. 각 매개 변수와 변수 이름을 차례로 강조 표시하고 "모두 찾기"를 선택하면 올바르게 입력되지 않은 변수를 볼 수 있습니다.

고급 기술 ... 그냥 그렇게 당신이 "언젠가"알고 ...

합니다 (함수가 스택에 보면 다음 함수의 스택 프레임을 잡아 보자 파이썬 기능이 있습니다 하나는 이것을 호출), 활성 변수를 확인하십시오.정말로 그렇게해야한다면, 각 스택 프레임의 변수 이름에 대해 자신의 매개 변수 이름을 검사하여 운영 체제의 주 프로그램으로 가져갈 수 있습니다.

유용하지 않은 경우는 거의 없습니다.

2

는 것을 확인하는 간단한 방법이있다 :

>>> def count_top_rt(tweet_set): 
...  print(id(tweet_set)) 
...  for tweet in tweet_set: 
...    print(tweet) 

>>> tweet_set = ["Sydney", "London", "Paris"] 
>>> count_top_rt(tweet_set) 
1951490534472 
Sydney 
London 
Paris 
>>> id(tweet_set) 
1951490534472 

>>> tweet_set2 = ["Sydney", "London", "Paris"] 
>>> count_top_rt(tweet_set2) 
1951490565832 
Sydney 
London 
Paris 
>>> id(tweet_set2) 
1951490565832 

변수가 변수로 전달 될 때 당신이 볼 수 있듯이이 지역 변수는에 reference하게는 상관없이 이름이 무엇 없습니다 글로벌 그 이유는 인터프리터가 지역 변수를 먼저 검색하여 변수를 확인하기 때문입니다 (함수의 매개 변수 동작 때문에 참조가되는 이유). 그런 다음 전역 변수를 참조해야합니다.

1

이 문제를 방지하는 가장 좋은 방법은 전역 변수를 사용하지 않는 것입니다. 모든 코드를 함수와 클래스에 넣으십시오. 당신이 count_top_rt의 정의에 인수 이름을 잘못 입력하는 경우

def count_top_rt(tweet_set): 
    for tweet in tweet_set: 
     print(tweet) 

def main(): 
    tweet_set = ["Sydney", "London", "Paris"] 
    count_top_rt(tweet_set) 

main() 

이것은 NameError 발생합니다.