【发布时间】:2016-09-09 01:53:55
【问题描述】:
我有一个函数,想要获取传递给它的参数。我尝试通过locals() 实现这一点,但我最终得到了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() 的下一个元素时出现错误;然后,由于 dict 已被修改,它失去了它的位置。不过,我不明白为什么字典大小应该改变。我推断,在每次通过for 循环时,变量x 被销毁,然后为下一次循环重新创建。但是,这似乎很奇怪,因为我认为保持x“活动”并在每次迭代时将其重新分配给新值会更有效。
最终,我想我可以做local_args = locals(),但我仍然很好奇到底发生了什么阻止我简单地循环通过locals()。我不确定我对x 被销毁/重新创建是否正确;如果我是,我必须想知道为什么会这样,如果我不是,那么我对正在发生的事情更加好奇。
【问题讨论】:
-
因为
x是一个新变量:因此它是局部变量字典中的一个新条目。 -
"但是,如果我用
locals()试试这个" 不,你已经尝试了一些微妙的不同。 -
你不应该使用
locals()。为什么你的函数不能是def print_params(*i):,然后是for x in i: print(x),或者只是print(*i)?当你传入参数时,它甚至会保留参数的原始顺序。 -
另外,你可能想要遍历
locals().values(),因为你想要的是值而不是键。或者甚至可能是locals().items()两者兼得。 -
没想过使用
.values()。这是一个很好的解决方案。使用*i也是如此;我不得不查看那个,因为我以前从未见过它,但我认为这是该语言的一个非常酷的特性。老实说,不知道它存在,但现在我知道了,我会使用它!