2014-11-10 2 views
0

숫자 목록을 생성 할 수 있도록 루프 밖에서 변수를 생성 할 때 파이썬 스크립트에서 작업하고 있습니다. 번호 목록 생성에 문제가 있습니다.루프 밖에서 변수를 사용하는 방법

나는이 때 :

def All_Channels(self): 
    #Pull the data from the database 
    channelList = list() 
    database_path = 
xbmc.translatePath(os.path.join('special://userdata/addon_data/script.tvguide', 
'source.db')) 

    if os.path.exists(database_path): 
     #get the channels list 
     cur.execute('SELECT channel FROM programs WHERE channel GROUP BY 
channel') 
     for row in cur: 
      channels = row[0].encode('ascii') 
      channelList.append(channels) 

      # set the channels text 
      for index in range(0, CHANNELS_PER_PAGE): 
       channel = channelList[index] 
       channel_index = index 

        if channel is not None: 
         for channels_id in range(4127, 4547, 70): 
          for channels_start_end in range(69): 
           ID = channels_id + channels_start_end 
          print ID 

이 같은 출력을 얻을 것이다 :

21:35:54 T:4724 NOTICE: 4545 
21:35:54 T:4724 NOTICE: 4545 
21:35:54 T:4724 NOTICE: 4545 
21:35:54 T:4724 NOTICE: 4545 
21:35:54 T:4724 NOTICE: 4545 
21:35:54 T:4724 NOTICE: 4545 
21:35:54 T:4724 NOTICE: 4545 

출력은 다음과 같이해야한다 :이 같은 출력을 얻을 것이다

:

21:35:54 T:4724 NOTICE: 4127 
21:35:54 T:4724 NOTICE: 4197 
21:35:54 T:4724 NOTICE: 4267 
21:35:54 T:4724 NOTICE: 4337 
21:35:54 T:4724 NOTICE: 4407 
21:35:54 T:4724 NOTICE: 4477 
21:35:54 T:4724 NOTICE: 4547 
for channels_id in range(4127, 4547, 70): 
    for channels_start_end in range(69): 
     ID = channels_id + channels_start_end 
    print ID 

당신은 내가 루프의 외부 원하는 번호를 생성하는 방법을 말해 주시겠습니까과 어떻게 루프의 외부 변수를 사용할 수 있습니다 : 문제 (3210)이 코드에서 거짓말인가?

편집 : 나는 이것을 할 때 :

for channels_id in range(4127, 4547, 70): 
    print channels_id 

나는 이것을 얻을 것이다 :

00:30:28 T:6972 NOTICE: 4127 
00:30:28 T:6972 NOTICE: 4197 
00:30:28 T:6972 NOTICE: 4267 
00:30:28 T:6972 NOTICE: 4337 
00:30:28 T:6972 NOTICE: 4407 
00:30:28 T:6972 NOTICE: 4477 

는 4547.

편집이 누락 하나 개의 값이 있습니다 * 업데이트 1 :

내가 이것을 사용하려고하면 :

# set the channels text 
for index in range(0, CHANNELS_PER_PAGE): 
    channel = channelList[index] 
    channel_index = index 

    for channels_id in range(4127, 4548, 70): 
     ID = [] 
     if channel is not None: 
      ID = channels_id 
    print ID 
    print channel 
    self.getControl(ID).setLabel(channel) 

출력 :은 행에 같은 값 7을 얻을 것이다으로

01:59:10 T:6768 NOTICE: 4547 
01:59:10 T:6768 NOTICE: 4547 
01:59:10 T:6768 NOTICE: 4547 
01:59:10 T:6768 NOTICE: 4547 
01:59:10 T:6768 NOTICE: 4547 
01:59:10 T:6768 NOTICE: 4547 
01:59:10 T:6768 NOTICE: 4547 

그것은 루프의 외부 값을 저장하지 않습니다.

난 그래서 그때 I 라벨시에 설정된 각 값 channel 변수를 사용하여 라벨을 설정하는 제어 self.getControl(ID).setLabel(channel) 사용하기 전에 값의리스트를 생성 할 수 for index 루프 아래 for channels_id의 루프를 사용할 변수 ID을 사용하여 값을 생성했습니다. 나중에 사용할 수 있도록 루프 외부에 값을 저장하는 방법을 묻습니다. 도움이 될 수 있으면 답변 게시물에서 코드를 업데이트하십시오.

+0

중첩 for 루프 외부에 ID를 선언하십시오. 그렇게하면 액세스 할 수 있습니다. – heinst

+1

@heinst : 아니요, 이것은 C가 아닙니다. 파이썬에서 변수를 "선언"하지 않는다면, 함수에 할당하면되고, 함수 (그리고 이해력과 같은 몇 가지 다른 것들)는 모든 스위트가 아닌 범위를 갖는다. – abarnert

+0

우리가 보여준 코드가 불완전하기 때문에 실행할 수없고 원하는 코드를 인쇄 할 수 없을 때 원하는 것을 정확하게 알기가 어렵습니다. 도움말에서 [최소한의 완전하고 검증 가능한 예] (http://stackoverflow.com/help/mcve)를 읽으십시오. – abarnert

답변

3

이미 수 있습니다. 루프 외부의 변수에 액세스하십시오. 그것이 UnboundLocalError이나 다른 예외를주지 않고 4545을 출력하는 이유입니다.

문제는 "루프 외부"는 루프의 마지막 값으로 한 번만 발생한다는 것입니다. 따라서 ID을 설정 한 다음 다시 설정하고 69 번 다시 설정 한 다음 69 번째 값을 최종적으로 인쇄하십시오. 69 개의 ​​각 값을 인쇄하려면 매번 루프를 통해 수행해야합니다.대신이의 :

for channels_start_end in range(69): 
    ID = channels_id + channels_start_end 
print ID 

는이 작업을 수행 : 목록에 추가하여 모든 69 개 값으로 뭔가를 수행하려는 경우, 당신은, 예를 들어, 그들 모두를 축적해야

for channels_start_end in range(69): 
    ID = channels_id + channels_start_end 
    print ID 

를 또는, 그래서 그들 모두 69 사용할 수 있습니다, 대신에 단지 마지막 : 귀하의 의견에서

IDs = [] 
for channels_start_end in range(69): 
    IDs.append(channels_id + channels_start_end) 
print IDs 

문제가처럼 보인다 훨씬 간단 해. 70 번째 값마다 모든 값을 인쇄하고 싶지는 않습니다. channels_id에 이미 70 번째 값이 있습니다. 그래서, 단지 print 그 :

for channels_id in range(4127, 4547, 70): 
    for channels_start_end in range(69): 
     ID = channels_id + channels_start_end 
    print channels_id 

하지만 실제로는, 당신이 그 ID 값으로 아무것도, 또는 모든 내부 루프와 유용한 아무것도 할하지 않는 것; 70 가지 값 중 69 가지를 생성하고 무시하는 대신 왜 처음에 생성하지 않는 것이 좋을까요? 이처럼 :

for channels_id in range(4127, 4547, 70): 
    print channels_id 

귀하의 마지막 문제는 루프가 4547을 포함하지 않습니다. 파이썬 range는 전용 미만 또는 동일한 값 이하보다 조리개 값을 포함하기 때문이다

. 간단한 예를 들어 :

>>> for i in range(0, 3, 1): 
...  print i 
0 
1 
2 

사항은 3를 인쇄하지 않았다.

따라서 range(4127, 4548, 70) 또는 range(4127, 4617, 70)을 사용할 수 있습니다. 사용 사례가 무엇인지 이해하지 않고 어느 것이 더 자연스러운 것인지 알기가 어렵습니다. 원하는 모든 값을 얻을 수 있습니다.

+0

도움을 주셔서 대단히 감사드립니다. 4127에서부터 4547까지 계산하는 값의 목록이 있습니다. 4127의 값으로 시작하여 70으로 계산하여 다음 값 4197을 얻은 다음 다시 70을 계산하여 다음 값을 구합니다. 값 4267 등등. 내가 어떻게 할 수 있니? – Mike

+0

출력을 얻기 위해 4127, 4197, 4267, 4337, 4407, 4477 및 4547 값을 생성하고 싶습니다. 어떻게 내가 그걸 할 수 있을지 아는가? – Mike

+0

@Mike : 이미 외부 루프에 'channels_id'라는 값을 생성하고 있습니다. 그런 다음 내부 루프는 4127-4196, 4197-4266 등의 'ID'값을 생성합니다. 이러한 ID 값을 인쇄하지 않으려면'ID'를 인쇄하지 말고'channels_id '를 인쇄하십시오 (내부 루프 바깥 쪽 - 또는 더 나은 것은 내부 루프를 없애기 위해서입니다. 왜냐하면 당신은 아무것도 사용하지 않기 때문입니다). – abarnert

관련 문제