python列表生成式的诡异错误

Python新手,刚学习一个月。现需要对一堆数据进行管理,想用直观的形式生成变量名方便后续数据处理,如V00,T01,等等,然后用以下这段代码无论如何都报错,求大神解答

def initialize_my_list():
    '''首先想生成一系列的元组数据'''
    for i in range(0,2):
        for j in range(0,2):
            locals()['V'+'%s'%i+'%s'%j]=('somedata')
    print(locals())#得到了V00,V01,V10等元组,用print检验了没错
    T0=[]
    T0.append([locals()['V%s%s'%(i,j)] for i in range(0,2) for j in range(0,2)])
    #这里思路就是想把上步生成的V00等加入到列表T0中去
    

然而一运行就报错:

Traceback (most recent call last):
File "deleteok.py", line 24, in <module>
initialize_my_list()
File "deleteok.py", line 22, in initialize_my_list
T0.append([locals()['V%s%s'%(i,j)] for i in range(0,2) for j in range(0,2)])
File "deleteok.py", line 22, in <listcomp>
T0.append([locals()['V%s%s'%(i,j)] for i in range(0,2) for j in range(0,2)])
KeyError: 'V00'


诡异的是如果手打,不用自动生成列表变量名的话就可以,代码如下:

def initialize_my_list():
    '''手打一系列的元组数据'''
    V00=(120,123,88)
    V01=(454,-12,234)
    V02=(67,345,852)
    V10=(44,12,33)
    V11=(1234,5634,97)
    V12=(9348,12,45)
    globals()['T0']=[locals()['V'+'01'],V01,V02]#这个是可行的!!!
    print(T0)
initialize_my_list()

    

这是为什么呢?

阅读 2.9k
2 个回答

老铁, 你好像忘记了local()函数的作用

clipboard.png

locals() 函数会以字典类型返回当前位置的全部局部变量, 而每一个函数内部又可以看做一个局部作用域

# 而此句的`local()`, 非彼句的`local()`啊:
T0.append([locals()['V%s%s'%(i,j)] for i in range(0,2) for j in range(0,2)])
# 所以此句的`local()`返回的是append()函数中的局部变量字典

你可以设一个中间变量

def initialize_my_list():
    '''首先想生成一系列的元组数据'''
    for i in range(0,2):
        for j in range(0,2):
            locals()['V'+'%s'%i+'%s'%j]=('somedata')
    print(locals())#得到了V00,V01,V10等元组,用print检验了没错
    T0=[]
    locals_dict = locals()
    T0.append([(locals_dict['V%s%s'%(i,j)]) for i in range(0,2) for j in range(0,2)])
    # T0.append(locals()['V00'])
    #这里思路就是想把上步生成的V00等加入到列表T0中去
    print(locals_dict)
initialize_my_list()

就像这样就搞定了


至于第二段代码, local()返回的确实是作用域initialize_my_list()中的局部变量, 所以是可行的

在绝大部分情况下, 调用 locals()globals() 方式存储变量, 带来的困扰更多, 它也不是操作变量的正确(合理?)方式.

为什么不用 list 或 map 存储内容呢?
以 map 为例

def initialize_my_list():
    myVars = {}
    for i in range(0,2):
        for j in range(0,2):
            myVars['V'+'%s'%i+'%s'%j]=('somedata')

    T0=[]
    T0.append([myVars['V%s%s'%(i,j)] for i in range(0,2) for j in range(0,2)])
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题