나는 함수가 있고 전달 된 인수를 얻고 싶다. 나는 locals()
을 통해이를 달성했지만, 나는 locals()
이 아닌 값 쌍의 키를 그만 둘 :`x for locals() :`- RuntimeError : locals()가 크기를 변경하는 이유는 무엇입니까?
>>>def print_params(i,j,k):
for x in locals():
print(x)
>>>print_params('a','b','c')
j
i
k #<--I want to get back 'a','b','c'.
내가 locals()
에서 대신 키의 값을 좀하고 싶습니다. 일반 DICT와
locals()
이것을 시도하는 경우,
>>> m = {
... 'a' : 'b',
... 'y' : 'z'}
>>> m
{'a': 'b', 'y': 'z'}
>>> for x in m:
... print(x)
...
a # <--Keys
y
>>> for x in m:
... print(m[x])
...
b # <--Values
z
그러나, 그것은 RuntimeError에 만들어집니다.
>>> def print_args(i,j,k):
... for x in locals():
... print(locals()[x])
...
>>> print_args('a','b','c')
b # <--Got one!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in y
RuntimeError: dictionary changed size during iteration
누군가 무슨 일이 일어 났는지 설명 할 수 있습니까? 오류가 발생하기 전에 인쇄해야하는 단일 값에서 루프가 locals()
의 다음 요소로 반복하려고 시도 할 때 오류가 발생하는 것을 볼 수 있습니다. 그 다음, dict이 수정되면서, 그것의 자리를 잃는다. 하지만 왜 사전 크기가 변해야하는지 이해할 수 없습니다. 나는 각각의 패스에서 for
루프를 통과 할 때 변수 x
이 파괴 된 다음 루프를 통해 다음 패스를 위해 다시 생성된다고 추측합니다. 그러나 이것은 이상한 것처럼 보입니다. 왜냐하면 x
을 "활성"상태로 유지하고 각 반복마다 새로운 값으로 다시 할당하는 것이 더 효율적이라고 생각할 것이기 때문입니다.
는 궁극적으로, 난 그냥 local_args = locals()
을 할 수있는 것 같아요,하지만 난 정확히 일어나고 것은 단순히 locals()
통해 반복에서 저를 방지 무엇으로 여전히 궁금하다. x
이 파괴되고 재현되는 것이 맞는지 확실하지 않습니다. 나는 그것이 무엇인지 궁금해해야만합니다. 그렇지 않다면 나는 무엇이 일어나고 있는지 더 궁금합니다.
'x'는 새로운 변수이므로 로컬 변수 사전에서 새 항목입니다. – zondo
"하지만,'locals()'로 이것을 시도하면"아니오, 당신은 미묘하게 다른 것을 시도했습니다. –
당신은'locals()'를 사용하지 않아도됩니다. 왜 당신의 함수는'def print_params (* i) :'그리고'for x in i : print (x)'또는'print (* i)'가 될 수 없습니까? 그것들을 전달할 때 인수의 원래 순서를 유지할 수도 있습니다. – TigerhawkT3