2014-10-07 3 views
0

일반적으로 "왜 전역 변수가 나쁜가"라는 대답은이 문제를 다루지 않는 것 같습니다. 그래서 이것이 나쁜 관행이 될지 궁금합니다.
당신은 당신이 항목
를 구축하는 또 다른 기능이
항목의 목록을 생성하는 하나 개의 기능을 가지고 당신은 각 기능의 모든 x 초 출력 현재 진행을하고 싶습니다 -전역 변수를 여러 함수에 전달하지 않도록 한 번만 설정하면 전역 변수를 사용하는 것이 좋습니까?

여기에 무슨 뜻인지의 예입니다 여기서 x는 코드의 시작 부분에 정의됩니다.

전역 변수로 설정하는 것이 좋지 않습니까? 당신은 첫 번째 코드에서했던 것과 같은 각 함수에 중요하지 않은 것을 전달하지 않아도되고, 모든 것을 목록으로 분류해야하는 곳에서 너무 지저분 해졌다가 함수 안에서 다시 꺼내야합니다. 이로 인해 실행하기에 너무 많은 입력이 필요한 개별 기능을 테스트 할 수 없었습니다.
또한 하나의 함수가 하나의 변수 만 필요로하는 경우, 다른 것을 추가하고 싶지 않기 때문에 모든 것을 담고있는 거대한리스트/사전을 전달하는 것이 이상적은 아닙니다.

또는 코드 전체에서 사용할 값을 포함하도록 전역 사전을 설정할 가치가 있습니까? 변수 이름을 키로 설정하여 필요할 때마다 쉽게 액세스 할 수 있습니다.

다른 파이썬 버전에 대해서는 확신 할 수 없지만, Maya에서는 동일한 코드 블록에 모두 포함되어 있으므로 다른 것에 영향을 줄 위험이 없습니다.

+0

"빌드"와 항목 목록 생성의 차이점을 이해하지 못합니다. – deets

+0

당신은 클래스 인스턴스를 설명하는 것처럼 들리지만, afterall은 사전으로 구현됩니다. –

+0

generate를 사용하면 목록을 계산하지만 메모리에 보관하면된다는 의미입니다. 그런 다음 목록을 사용하여 무언가를 할 수 있습니다. 그리고 클래스 인스턴스는 모든 것과 분리되어 있습니다.하지만 원하는 변수 이름을 지정하면 리턴됩니다. – Peter

답변

2

전역 변수 자체는 나쁘지 않습니다. 나쁜 점은 함수의 전역 변수를 수정하는 것입니다. 여기에 제안한 전역 상수를 읽는 것은 괜찮습니다. 심지어 global 키워드가 필요하지 않습니다. 파이썬은 그것을 발견 할 때까지 주변의 범위에서 var를 찾을 것이기 때문입니다. 실제로 상수라는 것을 나타 내기 위해 변수를 ALL_CAPS에 넣길 원할 수 있습니다.

그러나 변수를 인스턴스 속성으로 사용하여 코드를 클래스로 구성하는 것이 더 나은지 여부는 여전히 고려할 수 있습니다.

+0

아, 감사합니다. 저는 Maya에서 변수를 둘러 보지 않을 것이라고 생각합니다.하지만 함수 내부에 없으면 오류가 발생합니다. 그리고 클래스로 구조화함으로써, 당신은 절대적으로 한 클래스 안에있는 모든 것을 의미합니까, 아니면 변수를 저장하는 코드입니까? – Peter

0

기능이있는 디자인이 좋지 않을 수 있습니다. 이 thinfs를하기 위해 클래스를 사용해보십시오. Builder, Decorator, iterator 등과 같은 디자인 패턴에 대해 읽어보십시오.

0

정말 한 세트의 데이터 만 원할 경우 글로벌이 좋습니다. 또한 전역을 수정하면 합리적인 사용 사례가 있습니다. 예를 들어 re 모듈을 가져 가십시오. 그것은 재 컴파일의 비용을 절감하기 위해 이미 글로벌 디짓에있는 정규 표현식을 캐시합니다. re은 잠금으로 캐시를 보호하지 않지만 동일한 키를 여러 번 삽입하지 않으려면 threading.Lock을 사용하는 것이 일반적입니다.

1

Daniel이 말한 것처럼 전역 변수를 사용하는 것은 나쁘지 않습니다. 그러나 문제를 해결했기 때문에이를 사용한다고해서 전역 변수를 제대로 사용할 수는 없습니다.

위의 예에서는 다음과 같은 세 가지 조건이 있음을 알았습니다. 1) 항목 목록을 생성하는 함수가 필요합니다. 2) 두 번째 함수가 있습니다. 첫 번째 기능) 3) 해당 항목을 확인할 수 있기를 원합니다.

그 중 어느 것도 글로벌 필요성을 나타내지 않지만 클래스가 문제를 해결할 수 있습니다.나는 비슷한 클래스를 사용하는 것이 좋습니다 것 I는 다음과 같습니다

from threading import Thread # To thread the build logic 
import random     # For random numbers to increase entrophy 
import time 

class builder(object): 
    def __init__(self, numObjs): 
     self.myList = [] 
     self.numObjs = int(numObjs) 
     self.inProcess = False 

    # Build a list of objects 
    def build(self): 
     if self.currStatus(False) and self.inProcess == False: 
      self.inProcess = True 
      self.currGenThread = Thread(target=self.generate) 
      self.currGenThread.start() 
     else: 
      print "Failed to start new thread -- current thread in process!" 

    # Generates the objects for the list 
    def generate(self): 
     import random, time # Note: Solves thread "not defined" issues 
     self.myList = [] 
     for currObj in range(self.numObjs): 
      self.myList.append(currObj) 
      time.sleep(random.randint(0,1)) # Sleep randomly 

    # Prints the current status 
    # Return False indicates completion 
    def currStatus(self, alsoPrint=True): 
     retVal = True 
     if len(self.myList) >= self.numObjs: 
      if self.currGenThread: 
       self.currGenThread.join() 
       self.inProcess = False 
      retVal = False 

     # Print status if called for 
     if alsoPrint: 
      print "Progress %d -- %s" % (len(self.myList)/self.numObjs, 
             str(self.myList)) 
     return retVal 

obj = builder(10) 
obj.build() 
while obj.currStatus(): 
    time.sleep(1) 

그것은 완벽한 예 아니지만, 당신이 그 코드를 실행하면이 같은 얻을 :

$python test.py 
Progress 0 -- [] 
Progress 0 -- [0, 1, 2, 3] 
Progress 0 -- [0, 1, 2, 3, 4] 
Progress 0 -- [0, 1, 2, 3, 4, 5] 
Progress 0 -- [0, 1, 2, 3, 4, 5, 6] 
Progress 0 -- [0, 1, 2, 3, 4, 5, 6, 7, 8] 
Progress 1 -- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

python test.py 
Progress 0 -- [] 
Progress 0 -- [0, 1] 
Progress 0 -- [0, 1, 2, 3, 4, 5, 6, 7] 
Progress 1 -- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

당신은 할 수 있습니다 지구 적으로나 다른 여러면에서 똑같은 것. 잘하면이 도움이됩니다.

+0

고마워, 나는 당신의 코드를보고 몇 가지 새로운 것들을 배웠다. 비록 내 수업 지식이 좋지는 않지만 나는 비슷한 일을 할 수있을 것이라고 생각하지 않는다. 스레딩 aspect는 유용하게 보입니다. 전에 한번 들여다 보았습니다. Maya가 멀티 프로세싱을 사용할 수 없다는 것을 알았지 만 백그라운드에서 생성 처리는 정말 멋집니다. – Peter

+0

간단한 질문 - 사전에 수천 개의 파일을 생성하는 CPU 기능이 많은 경우 한 번에 여러 인스턴스를 실행하는 경우 생성 된 모든 사전을 동일한 것으로 연결할 수 있습니까? 나중에? – Peter

관련 문제