精华内容
下载资源
问答
  • Python获取变量名称

    千次阅读 2018-12-07 18:33:15
    当我们希望获取变量名称的时候,从python语法上确实没有给予特别的支持,不能像C/C++使用宏定义的方式来做。 对于Python的话,暂时应该是没有支持这个语法的,如何来实现呢?下面是相关的代码与解析

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

    参考文档:  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)

    展开全文
  • Python变量命名规则(超级详细)

    千次阅读 2021-02-03 13:28:35
    Python 需要使用标识符给变量命名,其实标识符就是用于给程序中变量、类、方法命名的符号(简单来说,标识符就是合法的名字)。Python 语言的标识符必须以字母、下画线(_)开头,后面可以跟任意数目的字母、数字和下画...

    Python 需要使用标识符给变量命名,其实标识符就是用于给程序中变量、类、方法命名的符号(简单来说,标识符就是合法的名字)。

    Python 语言的标识符必须以字母、下画线(_)开头,后面可以跟任意数目的字母、数字和下画线(_)。此处的字母并不局限于 26 个英文字母,可以包含中文字符、日文字符等。

    由于 Python 3 支持 UTF-8 字符集,因此 Python 3 的标识符可以使用 UTF-8 所能表示的多种语言的字符。Python 语言是区分大小写的,因此 abc 和 Abc 是两个不同的标识符。

    Python 2.x 对中文支持较差,如果要在 Python 2.x 程序中使用中文字符或中文变量,则需要在 Python 源程序的第一行增加“#coding:utf-8”,当然别忘了将源文件保存为 UTF-8 字符集。

    在使用标识符时,需要注意如下规则:

    标识符可以由字母、数字、下画线(_)组成,其中数字不能打头。

    标识符不能是 Python 关键字,但可以包含关键字。

    标识符不能包含空格。

    例如下面变量,有些是合法的,有些是不合法的:

    abc_xyz:合法。

    HelloWorld:合法。

    abc:合法。

    xyz#abc:不合法,标识符中不允许出现“#”号。

    abc1:合法。

    1abc:不合法,标识符不允许数字开头。

    Python 的关键字和内置函数

    Python 还包含一系列关键字和内置函数,一般也不建议使用它们作为变量名:

    如果开发者尝试使用关键字作为变量名,Python 解释器会报错。

    如果开发者使用内置函数的名字作为变量名,Python 解释器倒不会报错,只是该内置函数就被这个变量覆盖了,该内置函数就不能使用了。

    Python 包含了如表 1 所示的关键字:

    表 1 Python 关键字

    False

    None

    True

    and

    as

    assert

    break

    class

    continue

    def

    del

    elif

    else

    except

    finally

    for

    from

    global

    if

    import

    in

    is

    lambda

    nonlocal

    not

    or

    pass

    raise

    return

    try

    while

    with

    yield

    实际上 Python 非常方便,开发者可以通过 Python 程序来查看它所包含的关键字。例如,对于如下程序:

    #导入keyword 模块 import keyword #显示所有关键字 keyword.kwlist

    从上面代码可以看出,程序只要先导入 keyword 模块,然后调用 keyword.kwlist 即可查看 Python 包含的所有关键字。运行上面程序,可以看到如下输出结果:

    ['False','None','True','and','as','assert','break','class','continue','def','del','elif','else','except','finally','for','from','global','if','import','in','is','lambda','nonlocal','not','or','pass','raise','return','try','while','With','yield']

    上面这些关键字都不能作为变量名。

    此外,Python 3 还提供了如表 2 所示的内置函数。

    表 2 Python内置函数

    abs()

    all()

    any()

    basestring()

    bin()

    bool()

    bytearray()

    callable()

    chr()

    classmethod()

    cmp()

    compile()

    complex()

    delattr()

    dict()

    dir()

    divmod()

    enumerate()

    eval()

    execfile()

    file()

    filter()

    float()

    format()

    frozenset()

    getattr()

    globals()

    hasattr()

    hash()

    help()

    hex()

    id()

    input()

    int()

    isinstance()

    issubclass()

    iter()

    len()

    list()

    locals()

    long()

    map()

    max()

    memoryview()

    min()

    next()

    object()

    oct()

    open()

    ord()

    pow()

    print()

    property()

    range()

    raw_input()

    reduce()

    reload()

    repr()

    reversed()

    zip()

    round()

    set()

    setattr()

    slice()

    sorted()

    staticmethod()

    str()

    sum()

    super()

    tuple()

    type()

    unichr()

    unicode()

    vars()

    xrange()

    Zip()

    __import__()

    apply()

    buffer()

    coerce()

    intern

    上面这些内置函数的名字也不应该作为标识符,否则 Python 的内置函数会被覆盖。

    注意:在 Python 2.x 中,print 是关键字而不是函数。上面这些内置函数(如 unicode())只是 Python 2.x 的内置函数,为了保证 Python 程序具有更好的兼容性,程序也不应该使用这些内置函数的名字作为标识符。

    下一篇:Python数值类型(整形、浮点型和复数)

    展开全文
  • 声明变量主要有两种方法:tf.Variable和 tf.get_variable,二者的最大区别是: (1) tf.Variable是一个类,自带很多属性函数;而 tf.get_variable是一个函数; (2) tf.Variable只能生成独一无二的变量,即如果给出

    环境:Ubuntu14.04,tensorflow=1.4(bazel源码安装),Anaconda python=3.6

    声明变量主要有两种方法:tf.Variabletf.get_variable,二者的最大区别是:

    • (1) tf.Variable是一个,自带很多属性函数;而 tf.get_variable是一个函数;
    • (2) tf.Variable只能生成独一无二的变量,即如果给出的name已经存在,则会自动修改生成新的变量name;
    • (3) tf.get_variable可以用于生成共享变量。默认情况下,该函数会进行变量名检查,如果有重复则会报错。当在指定变量域中声明可以变量共享时,可以重复使用该变量(例如RNN中的参数共享)。

    下面给出简单的的示例程序:

    import tensorflow as tf
    
    with tf.variable_scope('scope1',reuse=tf.AUTO_REUSE) as scope1:
        x1 = tf.Variable(tf.ones([1]),name='x1')
        x2 = tf.Variable(tf.zeros([1]),name='x1')
        y1 = tf.get_variable('y1',initializer=1.0)
        y2 = tf.get_variable('y1',initializer=0.0)
        init = tf.global_variables_initializer()
        with tf.Session() as sess:
            sess.run(init)
            print(x1.name,x1.eval())
            print(x2.name,x2.eval())
            print(y1.name,y1.eval())
            print(y2.name,y2.eval())

    输出结果为:

    scope1/x1:0 [ 1.]
    scope1/x1_1:0 [ 0.]
    scope1/y1:0 1.0
    scope1/y1:0 1.0

    1. tf.Variable(…)

    tf.Variable(…)使用给定初始值来创建一个新变量,该变量会默认添加到 graph collections listed in collections, which defaults to [GraphKeys.GLOBAL_VARIABLES]。

    如果trainable属性被设置为True,该变量同时也会被添加到graph collection GraphKeys.TRAINABLE_VARIABLES.

    # tf.Variable
    __init__(
        initial_value=None,
        trainable=True,
        collections=None,
        validate_shape=True,
        caching_device=None,
        name=None,
        variable_def=None,
        dtype=None,
        expected_shape=None,
        import_scope=None,
        constraint=None
    )

    2. tf.get_variable(…)

    tf.get_variable(…)的返回值有两种情形:

    • 使用指定的initializer来创建一个新变量;
    • 当变量重用时,根据变量名搜索返回一个由tf.get_variable创建的已经存在的变量;
    get_variable(
        name,
        shape=None,
        dtype=None,
        initializer=None,
        regularizer=None,
        trainable=True,
        collections=None,
        caching_device=None,
        partitioner=None,
        validate_shape=True,
        use_resource=None,
        custom_getter=None,
        constraint=None
    )

    3. 根据名称查找变量

    在创建变量时,即使我们不指定变量名称,程序也会自动进行命名。于是,我们可以很方便的根据名称来查找变量,这在抓取参数、finetune模型等很多时候都很有用。

    示例1:

    通过在tf.global_variables()变量列表中,根据变量名进行匹配搜索查找。 该种搜索方式,可以同时找到由tf.Variable或者tf.get_variable创建的变量。

    import tensorflow as tf
    
    x = tf.Variable(1,name='x')
    y = tf.get_variable(name='y',shape=[1,2])
    for var in tf.global_variables():
        if var.name == 'x:0':
            print(var)

    示例2:

    利用get_tensor_by_name()同样可以获得由tf.Variable或者tf.get_variable创建的变量。
    需要注意的是,此时获得的是Tensor, 而不是Variable,因此 x不等于x1.

    import tensorflow as tf
    
    x = tf.Variable(1,name='x')
    y = tf.get_variable(name='y',shape=[1,2])
    
    graph = tf.get_default_graph()
    
    x1 = graph.get_tensor_by_name("x:0")
    y1 = graph.get_tensor_by_name("y:0")
    

    示例3:

    针对tf.get_variable创建的变量,可以利用变量重用来直接获取已经存在的变量。

    with tf.variable_scope("foo"):
        bar1 = tf.get_variable("bar", (2,3)) # create
    
    with tf.variable_scope("foo", reuse=True):
        bar2 = tf.get_variable("bar")  # reuse
    
    with tf.variable_scope("", reuse=True): # root variable scope
        bar3 = tf.get_variable("foo/bar") # reuse (equivalent to the above)
    
    print((bar1 is bar2) and (bar2 is bar3))
    展开全文
  • eclipse批量替换修改变量名称

    千次阅读 2020-02-24 17:04:19
    第一种 双击选中变量名id,右键选择Refactor中的Rename 如下图所示,红箭头的带有方框的就是选中修改的... 按下ctrl+f, 弹出下面右边界面,输入要寻找的id,替换为ID,在Options下要勾选下面两个箭头的两个...

    第一种

         双击选中变量名id,右键选择Refactor中的Rename

           如下图所示,红箭头的带有方框的就是选中修改的变量名,此时修改提示框的内容,后面带方框的也跟着修改,而蓝色箭头的不被选中的同名单词不会被修改,这也是和第二种方法的区别。

    第二种

      按下ctrl+f, 弹出下面右边界面,输入要寻找的id,替换为ID,在Options下要勾选下面两个箭头的两个,点击Replace All全部替换,注意和上面第一种的区别:下面的蓝色箭头的也会被修改

    展开全文
  • 然后经常会看到不同的书中*有靠近变量类型的,有靠近变量名称的,很迷惑这两者有什么区别。后来上网查证了一下,总结如下: 总体来说,*靠近哪一个都可以,编译器都会认为是指针变量,所以本质是一样的。但是两个...
  • 36、(多选题)下列有关于变量的命名正确的是 A.可以由字母、数字、下划线、”$”组成; B....C....D.Java大小写敏感,命名变量时需要...【答案解析】变量的命名首字母不能是数组开头,其他选项均正确 因此ACD是正确的选项。 ...
  • R语言关于更改变量名称

    千次阅读 2020-03-30 19:06:16
    关于R语言更改变量名称我们一般有四种办法 使用fix()函数 fix()函数打开交互式编辑器,可以对数据框以及列表进行编辑,要注意得是fix()里面是数据框,打开的是一个窗口,可在里面进行相应的编辑,修改变量名称...
  • 参考:http://blog.csdn.net/zx824/article/details/6677884C++对变量名不做存储 ...下面是一个例子 int n=5; 编译器编译它时,产生类似mov [0x00410FC0],5的指令,即:把5放在该内存地址的空间上。其中并没有出现
  • 如何判断类中有指定的成员函数,网上可以找到不少的文章,比如下面这两篇就写得很详细了 《C++11之美》 《C++模板,判断是否存在成员函数,实现差异化操作 》 我现在关心的是如何判断一个类中有成员变量?成员...
  • JavaScript变量的命名规则和规范

    千次阅读 2019-07-23 19:22:24
    1.规则 - 必须遵守的,不遵守会报错 由字母、数字、下划线、$符号组成,不能以数字开头 不能是关键字和保留字,例如:for、while。...下面哪些变量名不合法 良好的书写规范可以让你的JavaScript代码更上一...
  • python 动态生成变量名以及动态获取变量变量

    万次阅读 多人点赞 2018-07-05 16:19:04
    依次类推,但是我又不想手动的去写16个这样的名字,太累了,而且增加了代码的冗余性,灵活性也不强,所以有没有一种方法是能动态创建list名称的呢?答案是有的!而与之对应,既然要对上面的列...
  • 如何在给js起变量名时,拼接变量

    万次阅读 2019-06-25 20:03:42
    最近在传参时,需要给成吨的变量起名,例如:tree_1, tree_2, tree_3,甚至是这种:testList[0].id,testList[0].name,testList[1].id,testList[1].name… 问题 本想着在循环中拼接字符串与变量 i // 错误示范 ...
  • 在C/C++程序中打印变量名称

    万次阅读 2012-08-14 20:03:50
    最近一个同事问我,怎么能够在C程序中打印出变量名称。关于这个问题,我也有考虑过,只是一直没能想到比较好的方法。变量名不像文件名和函数名,可以通过C的库函数直接打印出来。在一番谷歌百度之后,终于知道可以用...
  • 环境变量是什么?有什么用?

    千次阅读 2018-08-17 14:01:18
    环境变量相对于给系统或用户应用程序设置的一些变量, 具体起什么作用这当然和具体的环境变量相关. 像path, 是告诉系统, 当要求系统运行一个程序而没有告诉它程序所在的完整路径时, 系统除了在当前目录下面寻找此程序...
  •  答:标识符就是用于给 Java 程序中变量、类、方法等命名的符号。 使用标识符时,需要遵守几条规则:  1. 标识符可以由字母、数字、下划线(_)、美元符($)组成,但不能包含 @、%、空格等其它特殊字符,不能...
  • 当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量; 如果需要访问本类当中的成员变量,需要使用格式:this.成员变量名 示例,下面是程序的主代码: 当方法的变量和类成员变量...
  • 文章目录1、变量的声明1.1、标准格式1.2、简短格式1.3、批量格式2、变量的初始化2.1、标准格式2.2、编译器推导类型的格式2.3、声明并初始化3、多个变量同时赋值4、匿名变量(没有名字的变量)5、变量的作用域5.1、...
  • 回答问题正确数量越多,score就越大。这里的score就是变量变量的定义:专业地讲,变量是被命名的计算机内存区域,一个变化的量,随着程序的运行,在不断改变。 “变量”是相对于“常量”来说的,“常量”就是...
  • 变量命名的通用规则

    万次阅读 2018-09-21 10:02:37
    1.变量名只能是字母(A-Z,a-z)、数字(0-9)或下划线。   2.第一个字母不能是数字,例如2Lerver...理论上,在遵守了上面几条规则的前提下,所声明的变量名称都是合法的。比如下面的命名:  char xueshengming[...
  • python如何获取变量变量

    千次阅读 2017-12-20 01:21:00
    假设现在存在一个值为1变量名为a的变量,如何通过一个函数获取该变量变量名a? 上面这个需求来源于某群友的一个要求,希望能有一个这样的函数来方便打印。 这个需求很扯淡啊,为什么不用格式化输出?它回复到‘懒...
  • 下面哪个不是Python合法的标识符

    千次阅读 2020-11-21 01:54:13
    63正确答案选 B。Python 中的标识符不能以数字开头,这也是普遍编程语言的通用规则,可参考:编辑于 2018-01-14 15:16:12回复(1)26python中的标识符:1)第一个字符必须是字母表中字母或下划线_。2)标识符的其他的...
  • 此外我们还会看到下面的这些形式 1.如果变量米有赋值或为空,使用value的值 ${variable:-value} 2.如果变量米有赋值或为空,使用value的值,并把变量赋值为value ${...
  • 程序中数据最基本的存储单位就是变量,程序执行时会在计算机内存中开辟空间存储变量。而计算机程序的执行基本就是通过读取或操作这些变量来实现的。此外,在某些时候,虽然声明了一个变量,但却不希望这个变量的数值...
  • 在eclipse/myeclipse中如果不小心把变量的高亮显示弄丢了。... Mark Occurences 最上边的大标题的复选框勾上,下面的就都可以高亮显示了,Local variables是变量的高亮显示还有其他的一些高亮的alt+shift+...
  • c语言变量名、函数名的命名规则

    万次阅读 多人点赞 2019-04-10 14:11:31
    (1)参数名称的命名参照变量命名规范。 (2)为了提高程序的运行效率,减少参数占用的堆栈,传递大结构的参数,一律采用指针或引用方式传递。 (3)为了便于其他 程序员 识别某个指针参数是入口参数还是出口参数,同时...
  • 分析:全局变量,局部变量,自动变量,静态变量标签:C语言 变量by ...下面首先我要分析全局变量与局部变量出现名称相同的情况。(1)全局变量与局部变量出现名称相同的情况直接上例子:# include void SomeFunc(floa
  • 如何给变量命名-彻底告别变量命名的苦恼

    万次阅读 多人点赞 2017-01-29 17:49:56
    变量名的力量 看完代码大全第11章『变量名的力量』,我想根据我们目前 最容易遇到的以及对于我们目前最需要重视的方面,提炼出一些书中的精华。在这经典之上再进行浓缩一下。 解释一个概念: 你不能像给狗...
  • Win10安装Tomcat服务器与配置环境变量

    万次阅读 多人点赞 2019-10-18 11:52:41
    文章目录下载安装JDK下载Tomcat压缩包解压Tomcat压缩包Tomcat目录结构启动Tomcat环境变量配置 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的...
  • python中全局变量和局部变量详解

    万次阅读 多人点赞 2018-11-13 12:18:46
    python中全局变量和局部变量的最大区别在于局部变量只能通过函数去访问,而全局变量可以直接访问。 !!! 我们先来看一个最简单的例子,事实上这并不是一个真正的全局变量,只是在类中的一个变量。 !!! 我们...
  • 对于变量的命名,我们主要记住下面三点就行了: 变量名是区分大小写的,比如:变量y和变量Y两者是不同变量变量名的首字母不能是数字和符号,比如:2y和_xy都不能作为变量名; 变量名不能包含空格号,比如:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 725,169
精华内容 290,067
关键字:

下面是正确的变量名称是