Python 使用自由变量时是否创建名称空间?

Python 使用自由变量时是否创建名称空间?,python,list,namespaces,Python,List,Namespaces,语句print(dir())的输出是一个空列表[]。是否创建了本地名称空间,但没有包含任何名称,或者根本没有创建?在您的情况下,x是全局名称空间的一部分,您可以通过 x = 2 def my_func(): print(x) print(dir()) my_func() 打印(locals()) 输出 以及打印(globals()) 输出 {code>{code>{name}uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

语句
print(dir())
的输出是一个空列表
[]
。是否创建了本地名称空间,但没有包含任何名称,或者根本没有创建?

在您的情况下,
x
是全局名称空间的一部分,您可以通过

x = 2
def my_func():
    print(x)
    print(dir())

my_func()
打印(locals())
输出

以及
打印(globals())
输出

{code>{code>{name}uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
在globals dict中,您可以看到打印在
my_func
范围中的
'x':2


x
值不是在函数中创建的,它只是从全局范围创建的。

如果在
dir()中传递任何参数,例如:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x004FC230>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/leeron.arad/Documents/test-proj/venv/t.py', '__cached__': None, 'x': 2, 'my_func': <function my_func at 0x0058E978>}
运行此文件,您可能会得到如下答案:

x = 2
def my_func():
    print(x)
    print(dir(1))

my_func()

它是由创建的,因为函数中没有局部变量。@Tom Karzes ThanksI认为它没有回答我的问题:“是否创建了局部名称空间,但没有包含任何名称,或者根本没有创建?”任何函数都有一个本地名称空间locals dict。当你定义参数/变量时,它们添加到这个dict函数中不能没有它。现在你给出了答案。
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x004FC230>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/leeron.arad/Documents/test-proj/venv/t.py', '__cached__': None, 'x': 2, 'my_func': <function my_func at 0x0058E978>}
x = 2
def my_func():
    print(x)
    print(dir(1))

my_func()
2
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']