飞机场的十点半
  • 4
  • 新人请关照

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()

    

这是为什么呢?

阅读 474
评论 2019-02-19 提问
    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()中的局部变量, 所以是可行的

    评论 赞赏 2019-02-20
      李毅
      • 4.3k

      在绝大部分情况下, 调用 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)])
      评论 赞赏 2019-02-20
        撰写回答

        登录后参与交流、获取后续更新提醒