2010-07-15 5 views
4

변수를 함수 내부에서 정의하려고합니다. vars()는 변수가 생성되었음을 보여 주지만 NameError : exception을 제공합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?문자열에서 변수를 정의

def a(str1): 
    vars() [str1] = 1 
    print vars() 
    print b 


a('b') 

출력 :

{'str1': 'b', 'b': 1} 

예외 :

NameError: global name 'b' is not defined 
+0

[파이썬 vars() 전역 이름 오류] 가능한 중복 (http://stackoverflow.com/questions/2226386/python-vars-global-name-error) – Thomas

답변

2

귀하의 코드는 나를 위해 작동합니다. 아마 당신은 다른 접근 시도해야합니다 : 구성체가 작동하지 않는 이유를 이해하지 않으면이 b=1

+0

이상한, 나는 2.6.4와 리눅스 py 2.5.4에서 작동하지 않습니다. – damir

+0

함수 범위 내의 exec()는 해당 함수 로컬 범위 내에서 작동합니다. – msw

1

를 실행합니다

exec(str1 + '=1') 

를, 어느 코드를 읽을 수있는 다음 사람은 것이다. 의미하는 경우

b = 1 

이렇게 말해야합니다. 이 경우 vars()에서 코드가 ba에 로컬하고 a를 종료에 따라 범위를 벗어나면 증발

def a(): 
    b = 1 

에 해당합니다 있도록 함수 지역 사전에 액세스 할 수 있습니다.

조기 최적화 산출 파이썬

from itertools import izip 
import timeit 

import msw.wordlist 

def zip_list(p): 
    """construct a dictionary of length 100 from a list of strings""" 
    return dict(zip(p[:100], p[100:])) 

def izip_list(p): 
    """as zip_list but avoids creating a new list to feed to dict()""" 
    return dict(izip(p[:100], p[100:])) 

def pass_list(p): 
    """take 100 elements of a list and do nothing""" 
    for i in p[:100]: 
     pass 

def exec_pass_list(p): 
    """exec() a no-op 100 times""" 
    for i in xrange(100): 
     exec('pass') 


# returns a list of 64'000 unique lowercase dictionary words for tests 
words = msw.wordlist.Wordlist() 
words.shuffle() 
words = words[:200] 
print 'words', words[:5], '...' 

for func in ['zip_list', 'izip_list', 'pass_list', 'exec_pass_list']: 
    t = timeit.Timer('%s(words)' % func, 
      'from __main__ import words, %s' % func) 
    print func, t.repeat(number=10**5) 

을 두 번째 추측 많은 사람들의 시도의 루트입니다 :

words ['concatenated', 'predicament', 'shtick', 'imagine', 'stationing'] ... 
zip_list [1.8603439331054688, 1.8597819805145264, 1.8571949005126953] 
izip_list [1.5500969886779785, 1.5501470565795898, 1.5536530017852783] 
pass_list [0.26778006553649902, 0.26837801933288574, 0.26767921447753906] 
exec_pass_list [74.459679126739502, 75.221366882324219, 77.538936853408813] 

나는 OP가하려고했던대로 구현하려고 귀찮게하지 않았다 왜냐하면 사전 정렬을 구성하지 않는 것이 50 배 더 느리기 때문에 추가 테스트가 다소 어리 석다.

+0

필자는 요점은 그가 변수 이름을 동적으로 원한다고 생각합니다. –

+0

그리고 질문의 묵시적인 측면에 대해서는 명시 적으로 대답하지 않았습니다. 질문을 명확하게 표현할 수없는 사람에게 배포하는 솔루션이 잘 사용되지 않을 가능성이 높기 때문입니다. 그렇습니다, 그것은 교육학적인 태도이지만, 그래서 그는 교육학에 관한 것입니다. – msw

+0

ok 이것은 가능한 빨리 될 수 있다고 가정합니다. 그래서 사전에 정의 된 100 개의 사전을 만드는 대신 문자열에서 var를 생성합니다. 그래서 이유가 있습니다. – damir

4

정의되지 않은 동작이 호출됩니다. documentation of vars() :

Note The returned dictionary should not be modified: the effects on the corresponding symbol table are undefined.

다른 해결책은 가능한 해결책을 제공합니다.

관련 문제