2014-03-12 2 views
0

값이 목록 인 사전 ('wakeup'은 아래 코드에 있음)이 있습니다.파이썬에서 def를 사용하여 사전 변이

난 그냥 아래처럼 데프를 사용하여 각 목록의 두 번째 요소를 변경하려면 :

def auto(t): 
    wakeup('zone1')[1] = wakeup('zone1')[0] - t 

wakeup = {'zone1': [15, auto(1)], 
      'zone2': [15, auto(1)]} 

print wakeup 

자동() 웨이크가 정의 된 전에 웨이크 업에 대한 참조를 만들기 때문에 그것은 작동하지 않습니다.

아직 깨우기 정의 이후에 def를 사용하여이 문제를 해결하려고하면이 시간 이후 깨우기 사전에서 auto()에 대한 참조가 만들어지기 때문에 오류가 계속 발생합니다. .

가 이상적으로이 목록에이 구문을 유지하고 싶은 : [15, 자동차 (1)]

좀 도와 주시겠습니까?

답변

2

당신은 변수 wakeup의 선언에 기능 auto를 호출하고이 기능 auto 내부 변수 wakeup 사용하려고합니다.

따라서 인스턴스화되기 전에 변수 wakeup을 사용하려고합니다. 필요할 때마다 당신이 기능 auto를 호출 할 수 있습니다,

wakeup = {'zone1': [15, zone1_def_val], 
      'zone2': [15, zone2_def_val]} 

을 다음 :

첫째, 당신은 변수 wakeup을 위해 당신이 원하는 초기 어떤 값을 결정해야

def auto(t): 
    wakeup['zone1'][1] = wakeup['zone1'][0] - t 

auto(2) 
auto(3) 
auto(5) 
... 
print wakeup 

사용할 필요가 있습니다 사전에있는 요소에 액세스 할 때 []이고 ()이 아님 :

wakeup['zone1'] # good 
wakeup('zone1') # bad 
+0

나는 그가 전역 변수를 실제로 변경하지 않고 그 변수 (참조)가 가리키고있는 사전의 인스턴스를 변경한다는 작은 반대를 하나 가지고 있습니다 : 그는 그것을 재 할당하지 않습니다. 그것은 글로벌하지 않고도 작동합니다. 나는 아직도 전역 변수를 다룰 때 항상 그것을 사용해야한다고 생각한다. –

+0

@Samy Arous : 흠, 확실한가요? 날 자동 변수'auto'가 전역 변수를 바꾼다. 나는 그것을 시도해 볼 것이다 ... –

+0

그래, 적어도 파이썬 2.7에서. 나는 아직 파이썬 3에 익숙하지 않다. wakeup에 새로운 값을 할당한다면 : wakupe = { 'zone1': [5, 0]} 전역 적으로 필요할 것이다. –

1

auto은 사전과는 아무런 관련이 없습니다. 그런 식으로 정의해야합니다.

def auto(n, t): 
    return n - t 

wakeup = {'zone1': [15, auto(15, 1)], 'zone2': [15, auto(15, 1)]} 

실제 코드가 이와 비슷하다면 전혀 기능이 필요하지 않습니다.

+0

고마워요!이것은 결국 간단합니다 :) – andgeo

1

코드가 유효하지 않습니다.

함수 내에서 사전을 수정하는 가장 좋은 방법은 인수로 전달하는 것입니다 여전히 사전을 수정할하지만, 사용 인수로 전달하지 않으려면

def auto(d, t): 
    for l in d.values(): 
     l[1] = l[0] - t 

wakeup = {'zone1': [15, 0], 
      'zone2': [15, 0]} 

auto(wakeup, 1) 

이 특별한 경우 글로벌 구문

def auto(t): 
    global wakeup 
    for l in wakeup.values(): 
     l[1] = l[0] - t 

wakeup = {'zone1': [15, 0], 
      'zone2': [15, 0]} 

auto(1) 

, 당신은 웨이크 업을 재 할당되지 않기 때문에, 그것은 글로벌 사용을 최대한 방지하는 것이 더 나은 것처럼, 당신은 정말 글로벌 필요는 없지만 항상 그것을 사용하는 것이 좋습니다 변수.

이 코드는 유효합니다

def auto(t): 

    for l in wakeup.values(): 
     l[1] = l[0] - t 

wakeup = {'zone1': [15, 0], 
      'zone2': [15, 0]} 

auto(1) 
관련 문제