精华内容
下载资源
问答
  • 问题:为什么要那样获取变量名呢?明明都已经把变量名给敲出来了?需求和要求:动态产生变量名应该是有规律动态创建使用exec动态赋值exec是python3里内置函数,支持python代码动态运行这种方式就相当于是执行...

    问题:

    为什么要那样获取变量名呢?明明都已经把变量名给敲出来了?

    需求和要求:

    动态产生的变量名应该是有规律的

    动态创建

    使用exec动态赋值

    exec是python3里的内置函数,支持python代码的动态运行

    这种方式就相当于是执行了语句“var1=1”

    if __name__=="__main__":

    for i in range(5):#注意随意指定的5,可看为个数

    exec('var{}={}'.format(i,i))

    # print (n0)

    print(var1,var2,var3)

    #输出:

    1,2,3

    利用命名空间动态赋值

    在Python的命名空间中,将变量名与值存储在字典中,

    可以通过locals(),globals()函数分别获取局部命名空间和全局命名空间。

    #命名空间动态赋值

    if __name__=="__main__":

    names=locals()#关键点在这

    for i in range(5):#注意随意指定的5,可看为个数

    names['n'+str(i)]=i

    # print (n0)

    for i in range(5):

    print(names['n'+str(i)])这样其实也不算新奇吧?

    在类中使用动态变量

    python的类对象的属性储存在的__dict__中。__dict__是一个词典,键为属性名,值对应属性的值。

    In [1]: class Test_class(object):

    ...: def __init__(self):

    ...: names = self.__dict__#其实和通过命名空间差不多

    ...: for i in range(5):

    ...: names['n' + str(i)] = i

    ...:

    In [2]: t = Test_class()

    In [3]: print(t.n0, t.n1, t.n2, t.n3, t.n4)

    0 1 2 3 4

    调用

    事实上,对于重复性的变量,我们一般不会这样调用变量,如:var0, var1, var2, var3 ,var4....varN,(即自己把变量名写出来)

    利用exec函数

    同样地,可以使用exec调用变量

    In [3]: for i in range(5):

    ...: exec('print(var{}, end=" ")'.format(i))

    ...:

    0 1 2 3 4

    利用命名空间

    因为命令空间的locals()与globals()均会返回一个字典,利用字典的get方法获取变量的值

    In [4]: names = locals()

    In [5]: for i in range(5):

    ...: print(names.get('var' + str(i)), end=' ')

    #或者

    print(names['var'+str(i)])

    0 1 2 3 4

    展开全文
  • Python获取变量名称

    千次阅读 2018-12-07 18:33:15
    (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考文档: (不得不赞叹,stackoverflow上大神很多啊!) ... 当我们希望获取变量名称的时候,...

    (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

    参考文档:  (不得不赞叹,stackoverflow上的大神很多啊!) https://stackoverflow.com/questions/18425225/getting-the-name-of-a-variable-as-a-string/18425523 

    当我们希望获取变量名称的时候,从python语法上确实没有给予特别的支持,不能像C/C++使用宏定义的方式来做。

    例如C++宏定义里面使用#就可以获取到相应的名称字符串了

    #define outputVar(var) { cout<<#var<<"="<<var<<endl;}
    

    对于Python的话,暂时应该是没有支持这个语法的,如何来实现呢?下面是相关的代码与解析:

    我个人认为最优的方案是方案三, 方案三可以支持一些形如a.val的情况.

     

    方案一,使用Inspect库

    首先:引入Inspect库,通过inspect.stack()获取相关的栈信息

    Stack信息形如:
    FrameInfo(frame=<frame at 0x00538B48, file 'E:\\python\\test.py', line 8, code retrieve_name>, filename='E:\\python\\test.py', lineno=8, function='retrieve_name', code_context=['    print(inspect.stack())\n'], index=0), 
    FrameInfo(frame=<frame at 0x01E77C90, file 'E:\\python\\test.py', line 18, code outputVar>, filename='E:\\python\\test.py', lineno=18, function='outputVar', code_context=['    print("output: {}".format(retrieve_name(var)).center(50, "-"))\n'], index=0), 
    FrameInfo(frame=<frame at 0x010B4340, file 'E:\\python\\test.py', line 22, code <module>>, filename='E:\\python\\test.py', lineno=22, function='<module>', code_context=['outputVar(pairs)\n'], index=0), 
    FrameInfo(frame=<frame at 0x00B37C70, file 'D:\\python3.7\\lib\\idlelib\\run.py', line 474, code runcode>, filename='D:\\python3.7\\lib\\idlelib\\run.py', lineno=474, function='runcode', code_context=['                exec(code, self.locals)\n'], index=0), 
    FrameInfo(frame=<frame at 0x0104BBC8, file 'D:\\python3.7\\lib\\idlelib\\run.py', line 144, code main>, filename='D:\\python3.7\\lib\\idlelib\\run.py', lineno=144, function='main', code_context=['                ret = method(*args, **kwargs)\n'], index=0), 
    FrameInfo(frame=<frame at 0x00681C30, file '<string>', line 1, code <module>>, filename='<string>', lineno=1, function='<module>', code_context=None, index=None)
    

    然后:查找栈变量信息,从顶向下,一层一层的解析栈中的变量元素fi.frame.f_locals.items。不过第一层肯定是本函数的,不能使用,最少需要从第一层往上找,或者直接把stack倒序reversed来找。例如,我采用从第二层开始找,inspect.stack() [2:],因为我这边有二次封装输出函数。

    FrameInfo逐项信息:第一层是本函数的,第二层是调用函数的,第三层...
    frame=<frame at 0x00538B48, file 'E:\\python\\test.py', line 8, code retrieve_name>, 
    filename='E:\\python\\test.py', 
    lineno=8, 
    function='retrieve_name', 
    code_context=['    print(inspect.stack())\n'], 
    index=0), 

    最后:识别变量,f_locals.items是变量名称与指向信息的组合,借用输入参数来判定is和指向信息是否一致,一致的话,把变量名称返回。

    Items形如:
    ('__name__', '__main__')
    ('__doc__', None)
    ('__package__', None)
    ('__loader__', <class '_frozen_importlib.BuiltinImporter'>)
    ('__spec__', None)
    ('__annotations__', {})
    ('__builtins__', <module 'builtins' (built-in)>)
    ('__file__', 'E:\\python\\test.py')
    ('re', <module 're' from 'D:\\python3.7\\lib\\re.py'>)
    ('inspect', <module 'inspect' from 'D:\\python3.7\\lib\\inspect.py'>)
    ('sys', <module 'sys' (built-in)>)
    ('str', '')
    ('pairs', [''])
    ('retrieve_name', <function retrieve_name at 0x01E764B0>)
    ('outputVar', <function outputVar at 0x01E764F8>)

    整个实现如下:调用时使用outputVar可以输出形如 abc=123 的打印效果。

    #从堆栈第3层开始查找返回变量名称
    def retrieve_name(var):
        for fi in inspect.stack()[2:]:
            for item in fi.frame.f_locals.items():
                if (var is item[1]):
                    return item[0]    
        return ""
    
    #输出函数
    def outputVar(var):
        print("{} = {}".format(retrieve_name(var),var))

    方案二,使用sys库获取

    使用sys库获取栈信息,具体的思路和上面一致。

    只是遍历frame时,通过sys库直接遍历,免去了一层封装。

    def retrieve_name_ex(var):
        frame = sys._getframe(2)
        while(frame):
            for item in frame.f_locals.items():
                if (var is item[1]):
                        return item[0]
            frame = frame.f_back
        return ""
    
    def outputVar(var):
        print("{} = {}".format(retrieve_name_ex(var),var))   

     

    方案三, 从代码中获取名称

    尝试方案一二发现一个比较致命的问题, 当变量是复杂类型的时候, 支持的不好, 形如a[1], b.val的情况, 这种情况, 变量是a, b, 而a[1], b.val的指向并非在locals中有直接给出, 这就尴尬了.

    所以想到了一种新的主意, 从代码行中获取, stack中有相关的调用函数信息, 也收集了代码行的信息, 这个时候, 如果从代码行获取信息的话, 大多数情况下应该都没有什么大碍了! (方法也在stackoverflow中发布了下)

    代码如下: 注意, 使用时使用 outputVar 函数, 因为代码中用的第二层栈对应的代码.

    #Owed by: http://blog.csdn.net/chunyexiyu
    #direct get the input name from called function code
    def retrieve_name_ex(var):
        stacks = inspect.stack()
        try:
            callFunc = stacks[1].function
            code = stacks[2].code_context[0]
            startIndex = code.index(callFunc)
            startIndex = code.index("(", startIndex + len(callFunc)) + 1
            endIndex = code.index(")", startIndex)
            return code[startIndex:endIndex].strip()
        except:
            return ""
    def outputVar(var):
        print("{} = {}".format(retrieve_name_ex(var),var))

     

     (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

     

     

    展开全文
  • 依次类推,但是我又不想手动去写16个这样名字,太累了,而且增加了代码冗余性,灵活性也不强,所以有没有一种方法是能动态创建list名称的呢?答案是有!而与之对应,既然要对上面列表动态操作,...
    490360c6979c32aaae6cd43dea5ec875.png

    【导语】:必须现在需要动态创建16个list,每个list的名字不一样,但是是有规律可循,比如第一个list的名字叫:arriage_list_0=[],第二个叫arriage_list_1=[]……..依次类推,但是我又不想手动的去写16个这样的名字,太累了,而且增加了代码的冗余性,灵活性也不强,所以有没有一种方法是能动态创建list名称的呢?答案是有的!而与之对应,既然要对上面的列表动态操作,肯定是少不了动态去解析list名称。所以下面开始介绍方法。

    一、python 动态生成变量名 —— locals()

    代码之前,先介绍一个函数:
    locals() 函数会以字典类型返回当前位置的全部局部变量。

    # 两个局部变量:arg、zdef runoob(arg):    z = 1    print(locals())runoob(4)

    结果:{'arg': 4, 'z': 1}

    下面动态创建名字为list_0到list_15的16个list列表:

    def test_list_pre():    prepare_list = locals()    for i in range(16):        prepare_list['list_' + str(i)] = []        prepare_list['list_' + str(i)].append(('我是第' + str(i)) + '个list')    print(prepare_list['list_0'])    print(prepare_list['list_1'])    print(prepare_list['list_2'])    print(prepare_list['list_3'])if __name__ == '__main__':    test_list_pre()

    结果:
    ['我是第0个list']
    ['我是第1个list']
    ['我是第2个list']
    ['我是第3个list']

    实际证明,已经动态的每次往list插入了值

    二、动态获取变量的变量名

    如果有了上面的动态命名list,那么当动态获取变量的变量名,就需要如下的操作:
    利用python原生的inspect库来实现

    def get_variable_name(variable):    callers_local_vars = inspect.currentframe().f_back.f_locals.items()    return [var_name for var_name, var_val in callers_local_vars if var_val is variable]if __name__ == '__main__':    prepare_list = locals()    for i in range(16):        prepare_list['list_' + str(i)] = []        prepare_list['list_' + str(i)].append(('我是第' + str(i)) + '个list')    a = get_variable_name(prepare_list['list_0']).pop()    b = get_variable_name(prepare_list['list_1']).pop()    print(a)    print(b)

    结果:
    list_0
    list_1

    希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油。

    展开全文
  • 依次类推,但是我又不想手动去写16个这样名字,太累了,而且增加了代码冗余性,灵活性也不强,所以有没有一种方法是能动态创建list名称的呢?答案是有!而与之对应,既然要对上面列表动态操作,...

    前言

    需求:

    必须现在需要动态创建16个list,每个list的名字不一样,但是是有规律可循,比如第一个list的名字叫:

    arriage_list_0=[],第二个叫arriage_list_1=[]……..依次类推,但是我又不想手动的去写16个这样的名字,太累了,而且增加了代码的冗余性,灵活性也不强,所以有没有一种方法是能动态创建list名称的呢?答案是有的!而与之对应,既然要对上面的列表动态操作,肯定是少不了动态去解析list名称。所以下面开始介绍方法。

    python 动态生成变量名

    locals函数

    代码之前,先介绍一个函数:

    locals() 函数会以字典类型返回当前位置的全部局部变量。

    菜鸟上的例子:

    >>>def runoob(arg): # 两个局部变量:arg、z

    ... z = 1

    ... print (locals())

    ...

    >>> runoob(4)

    {'z': 1, 'arg': 4} # 返回一个名字/值对的字典

    下面用自己的例子来实现下,目标:动态创建名字为list_0到list_15的16个list列表:

    关键代码:

    # 第一步 准备locals函数

    prepare_list = locals()

    """

    第二步 循环16次,从0-15赋值给locals函数对应的变量prepare_list

    prepare_list是一个字典,所以将我们需要的列表名称作为key值传入

    """

    for i in range(16):

    arriage_list['list_' + str(i)] = []

    测试代码:

    def test_list_pre():

    prepare_list = locals()

    for i in range(16):

    prepare_list['list_' + str(i)] = []

    prepare_list['list_' + str(i)].append(('我是第' + str(i)) + '个list')

    print(prepare_list['list_0'])

    print(prepare_list['list_1'])

    print(prepare_list['list_2'])

    print(prepare_list['list_3'])

    if __name__ == '__main__':

    test_list_pre()

    实验截图:

    实际证明,已经动态的每次往list插入了值。

    python 动态获取变量的变量名

    需求目标:如果有了上面的动态命名list,那么当动态获取变量的变量名,就需要如下的操作:

    利用python原生的inspect库来实现:

    核心代码:

    import inspect

    def get_variable_name(variable):

    callers_local_vars = inspect.currentframe().f_back.f_locals.items()

    return [var_name for var_name, var_val in callers_local_vars if var_val is variable]

    测试代码:

    def get_variable_name(variable):

    callers_local_vars = inspect.currentframe().f_back.f_locals.items()

    return [var_name for var_name, var_val in callers_local_vars if var_val is variable]

    if __name__ == '__main__':

    prepare_list = locals()

    for i in range(16):

    prepare_list['list_' + str(i)] = []

    prepare_list['list_' + str(i)].append(('我是第' + str(i)) + '个list')

    a = get_variable_name(prepare_list['list_0']).pop()

    b = get_variable_name(prepare_list['list_1']).pop()

    print(a)

    print(b)

    实验截图:

    以上这篇python 动态生成变量名以及动态获取变量的变量名方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    展开全文
  • python 获取环境变量

    千次阅读 2019-01-15 16:07:22
    Python Shell设置或获取环境变量的方法: 一、设置系统环境变量 1、os.environ['环境变量名称']='环境变量值' #其中key和value均为string类型 2、os.putenv('环境变量名称', '环境变量值') 二、获取系统环境...
  • 前言 需求: 必须现在需要动态创建16个list,每个list名字不一样,但是是有规律可循,比如第一个...python 动态生成变量名 locals函数 代码之前,先介绍一个函数: locals() 函数会以字典类型返回当前位置全部局部
  • 依次类推,但是我又不想手动去写16个这样名字,太累了,而且增加了代码冗余性,灵活性也不强,所以有没有一种方法是能动态创建list名称的呢?答案是有!而与之对应,既然要对上面列表动态操作,...
  • 依次类推,但是我又不想手动去写16个这样名字,太累了,而且增加了代码冗余性,灵活性也不强,所以有没有一种方法是能动态创建list名称的呢?答案是有!而与之对应,既然要对上面列表动态操作,...
  • 依次类推,但是我又不想手动去写16个这样名字,太累了,而且增加了代码冗余性,灵活性也不强,所以有没有一种方法是能动态创建list名称的呢?答案是有!而与之对应,既然要对上面列表动态操作,...
  • python 动态生成变量名以及动态获取变量的变量名

    万次阅读 多人点赞 2018-07-05 16:19:04
    依次类推,但是我又不想手动去写16个这样名字,太累了,而且增加了代码冗余性,灵活性也不强,所以有没有一种方法是能动态创建list名称的呢?答案是有!而与之对应,既然要对上面列...
  • 在不幸是,字符串“%”格式是在stringobject.C中C例程“PyString_Format”中实现。此例程不提供允许访问格式字符串解析形式API或钩子。它只是在解析格式字符串时构建结果。因此,任何...
  • python 中如何判断获取查看变量的类型 1.python内置的变量类型使用type(变量名称)来查看。 2.pandas的变量如dataframe、series可以使用:变量名称.dtypes()来获取变量类型。
  • 您希望在命令中使用lambda并将text值赋给变量。然后将该变量传递给getTest(self, text)方法,以便能够打印按钮。从你评论Whole code is not need i just need way to get buttons text nothing else我已经创建了...
  • /usr/bin/env python-- coding: utf-8 --"""这是注释__doc__会打印这部分内容"""以字典方式返回所有内置变量print(vars())返回当前文件路径print(file)获取导入该文件路径,当前文件内输出会返回Noneprint...
  • 一变量(本文使用python3.5): #变量:是计算机内存中的一块区域,变量可以存储规定范围内的...获取变量的类型#在python中数据的存储是以值(数据)为主,计算机内存中存储的是数值 变量只是一个对数据的引用 ...
  • 遂在网上查找相关资料,找到这么一篇文章:用Python Shell设置或获取环境变量的方法:一、设置系统环境变量1、os.environ['环境变量名称']='环境变量值'#其中key和value均为string类型2、os.putenv('环境变量名称','...
  • /usr/bin/env python# -*- coding: utf-8 -*-"""这是注释__doc__会打印这部分内容"""# 以字典方式返回所有内置变量print(vars())# 返回当前文件路径print(file)# 获取导入该文件路径,当前文件内输出会返回...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • Python基础 变量(一)

    2021-02-16 00:23:23
    目录Python基础 变量一、内存空间中表示式二、命名规则系统关键字 一、内存空间中表示式 可以将变量名简单理解为一个有标识箱子,里面存储着存储对象在内存中地址 1、通过id()方法获取存储对象在内存中...
  • 以下程序用inspect包编写get_var_name函数获取变量名,然后对字典列表进行了遍历输出,在打印每个信息开头都输出了变量名作为提示。 import inspect def get_var_name(var): for fi in reversed(inspect.stack()...
  • CDA数据分析师 出品大家好,我是一行,作为当下最受欢迎和市场使用的编程语言之一,Python在广大职场人士的日常事务中占据越来越重要的位置。今天我们就对Python中...定义中的标识符就是变量的名称。在Python中当变...
  • python中无法轻松获取变量的名称(参见此answer).对于传递给python中的函数的变量,有使用inspect的hacky解决方案,详细信息here以及基于此answer的案例解决方案,import matplotlib.pyplot as pltimport numpy as np...
  • 全局变量和局部变量 全局变量:定义在函数外的变量 局部变量:定义在函数内部变量 获取变量值时候先获取当前作用域变量名称和变量值,如果没找到到上一层作用域招变量的值,在没有就报错,先获取局部变量,没有获取...
  • 我正在尝试使用Python将protobuf文件转换成Objective-C类。例如,给定protobuf消息:message Person {required ...}我想把它转换成objc类:^{pr2}$关键是获取每个属性的名称和类型。例如,protobuf消息中的“可选...
  • 应用场景描述:通过配置文件获取服务器上配置服务名及运行端口号,编写python脚本检测服务上服务是否在运行?#!/usr/bin/env python# -*- coding:utf-8 -*-# fileName: config.py# 服务配置class config:service...
  • Python-练习 18 名称变量,代码,函数ex18.py代码功能注意运行结果问题 函数一般就是做以下这些事情: 1. 它们为一些代码起名字,就像变量为字符串和数字起名字一样。 2. 它们像脚本获取 argv 一样获取参数...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 255
精华内容 102
关键字:

python获取变量的名称

python 订阅