【发布时间】:2018-10-22 18:22:51
【问题描述】:
我们已经知道函数参数曾经有limit of 255 explicitly passed arguments。然而,这种行为现在改变了,因为 Python-3.7 没有限制,除了 sys.maxsize 这实际上是 python 容器的限制。但是局部变量呢?
我们基本上不能以动态方式向函数添加局部变量和/或直接更改locals() 字典是不允许的,因此甚至可以以蛮力的方式对其进行测试。但问题是,即使您使用compile 模块或exec 函数更改locals(),它也不会影响function.__code__.co_varnames,因此,您无法在函数内显式访问变量。
In [142]: def bar():
...: exec('k=10')
...: print(f"locals: {locals()}")
...: print(k)
...: g = 100
...:
...:
In [143]: bar()
locals: {'k': 10}
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-143-226d01f48125> in <module>()
----> 1 bar()
<ipython-input-142-69d0ec0a7b24> in bar()
2 exec('k=10')
3 print(f"locals: {locals()}")
----> 4 print(k)
5 g = 100
6
NameError: name 'k' is not defined
In [144]: bar.__code__.co_varnames
Out[144]: ('g',)
这意味着即使您使用 for 循环,例如:
for i in range(2**17):
exec(f'var_{i} = {i}')
locals() 将包含 2**17 个变量,但您不能在函数内执行类似 print(var_100) 的操作。
我们知道基本上不需要动态地向函数添加变量,而您可以使用字典或换句话说自定义命名空间。但是测试函数中局部变量的最大数量限制的正确方法是什么?
【问题讨论】:
-
请注意,这个问题指的是 CPython(参考实现),而不是 Python(规范)。
-
@Acorn 确实,刚刚更新。
标签: python python-3.x function namespaces python-internals