为何名字空间里有,确无法调用?

简单的函数:

def cal_out(data):
    return data`

一个调用它的函数

def cal_in():
    for key,value in {"x1":1,"x2":2}.items():
        locals()[key] = cal_out(value)
    print(locals())

查看调用的情况

cal_in()
{'key': 'x2', 'value': 2, 'x1': 1, 'x2': 2}
调用后,名字空间里面有x1, x2.

现在加一句

def cal_in():
    for key,value in {"x1":1,"x2":2}.items():
        locals()[key] = cal_out(value)
    print(locals())
    print(x1,x2)

再调用

cal_in()
{'key': 'x2', 'value': 2, 'x1': 1, 'x2': 2}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in cal_in
NameError: name 'x1' is not defined

为何会这样?名字空间里面明明有

阅读 1.3k
1 个回答
新手上路,请多包涵

locals()是只读的,它返回的是局部命名空间的拷贝,就是一个普通的字典,修改不会对局部的命名空间产生影响;
但是globals()全局命名空间时候可以修改的,修改它的值会对全局的命名空间产生影响。

if __name__ == '__main__':
    locals()["x1"] = 88

这样是可以修改的,这里的locals()和globals()是完全一样的,修改locals()实际上就是在修改globals()的值
参考地址:https://blog.csdn.net/sxingmi...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进