У меня есть функция и вы хотите получить переданные ей аргументы. Я пытался добиться этого с помощью locals()
, но я в конечном итоге получить ключи от locals()
, а не значения пара:`Для x в 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()
.
С нормальным Словаре, я знаю, что могу это сделать:
>>> 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
Но, если бы я попробовать это с locals()
, он создает 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()
; то, когда дикт был изменен, он теряет свое место. Я не могу понять, почему размер словаря должен измениться. Я предполагаю, что на каждом проходе через цикл 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