Python:如何将字符串作为变量名

转自:http://blog.csdn.net/ztf312/article/details/51122027

一共三种方法:

[python] view plain copy

  1. >>> var = "This is a string"
  2. >>> varName = ‘var‘
  3. >>> s= locals()[varName]
  4. >>> s
  5. ‘This is a string‘
  6. >>> s2=vars()[varName]
  7. >>> s2
  8. ‘This is a string‘
  9. >>> s3=eval(varName)
  10. >>> s3
  11. ‘This is a string‘

1. locals()

locals是python的内置函数,他可以以字典的方式去访问局部和全局变量。

python里面用名字空间记录着变量,就像javascript的window一样,他记录着各种全局变量。

每个模块,每个函数都有自己的名字空间,记录着变量,常量,类的命名和值。

就像JS一样,当python在使用变量时,会按照下面的步骤去搜索:

  • 函数或类的局部变量。
  • 全局变量。
  • 内置变量。

以上三个步骤,其中一步骤找到对应的变量,就不会再往下找。如果在这三个步骤都找不到,就会抛出异常。

locals与globals的区别

  • locals()是只读的。globals()不是。这里说的只读,是值对于原有变量的只读。其实还可以对locals()赋值的。
  • globals返回的是当前模块的全局变量 locals返回的是局部变量。注意,locals返回的是当前所在最小命名空间的局部变量的一个拷贝。

体检locals

[python] view plain copy

  1. list1 = [1,2,3]
  2. locals()
  3. # 在全局中使用locals,会打印出list1和__builtins__、__name__、__doc__、__package__
  4. 复制代码
  5. def foo(args):
  6. x=1
  7. print locals()
  8. foo(123)
  9. #将会得到 {‘arg‘:123,‘x‘:1}

2. vars()

本函数是实现返回对象object的属性和属性值的字典对象。如果默认不输入参数,就打印当前调用位置的属性和属性值,相当于locals()的功能。如果有参数输入,就只打印这个参数相应的属性和属性值。

[python] view plain copy

  1. #vars()
  2. print(vars())
  3. class Foo:
  4. a = 1
  5. print(vars(Foo))
  6. foo = Foo()
  7. print(vars(foo))

3. eval()

eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。

结合math当成一个计算器很好用。

其他用法,可以把list,tuple,dict和string相互转化。见下例子:

[python] view plain copy

  1. a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
  2. b = eval(a)
  3. b
  4. Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
  5. type(b)
  6. Out[4]: list
  7. a = "{1: ‘a‘, 2: ‘b‘}"
  8. b = eval(a)
  9. b
  10. Out[7]: {1: ‘a‘, 2: ‘b‘}
  11. type(b)
  12. Out[8]: dict
  13. a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
  14. b = eval(a)
  15. b
  16. Out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))

强大的函数有代价。安全性是其最大的缺点。

想一想这种使用环境:需要用户输入一个表达式,并求值。

如果用户恶意输入,例如:

__import__(‘os‘).system(‘dir‘)

那么eval()之后,你会发现,当前目录文件都会展现在用户前面。

那么继续输入:

open(‘文件名‘).read()

代码都给人看了。获取完毕,一条删除命令,文件消失。哭吧!

怎么避免安全问题?

(1) 自行写检查函数;

(2) 使用ast.literal_eval

时间: 2024-10-10 13:33:33

Python:如何将字符串作为变量名的相关文章

Python中如何将字符串作为变量名

应用场景描述: 通过配置文件获取服务器上配置的服务名及运行端口号,编写python脚本检测服务上服务是否在运行? #!/usr/bin/env python # -*- coding:utf-8 -*-# fileName: config.py # 服务配置 class config: serviceList = 'service1,service2,service3' service1 = '服务1' service1Port = 8001 service2 = '服务2' service2P

JavaScript字符串转换为变量名

1.将一个字符串转换为变量名 [javascript] view plain copy print? function string_to_name(string){ let _name = 'var new_name=' + string; eval(_name); return _name; } 2.将一个字符串转换为变量并赋值 [javascript] view plain copy print? var str='string'; var _script='var '+ string +

python以下划线开头的变量名含义

Python核心风格:避免用下划线作为变量名的开始. 因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始.一般来讲,变量名_xxx被看作是“私有的”,在模块或类外不可以使用.当变量是私有的时候,用_xxx 来表示变量是很好的习惯.因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格. "单下划线" "单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和自类对象自己能访问

JS 字符串 作为变量名

function initCKEditor(querySelector,content_val,myEditor) { ClassicEditor.create(document.querySelector(querySelector), { toolbar: ["undo", "redo", "|", "alignment", "bold", "italic", "block

python动态赋值-把字符串转为变量名

可以实现的方法有: globals(),locals(),eval(),exec() 演示: exece法 In [6]: exec('name="bob"') In [7]: name Out[7]: 'bob' globals用法: In [1]: globals()['name']='bob' In [2]: name Out[2]: 'bob' 原文地址:https://www.cnblogs.com/kaerxifa/p/11424796.html

C#里面中将字符串转为变量名

public partial class Form1 : Form { string str = "spp"; public string spp = "very good"; public Form1() { InitializeComponent(); MessageBox.Show(this.GetType().GetField(str).GetValue(this).ToString()); } }

查找jar包中.class文件关键字(变量名,字符串)

有时查看日志,常常会发现由框架底层打印的错误日志.要修改这个错误的时候,如果不是对框架特别熟悉,就需要按照可能产生这个错误日志的流程一步一步找,一时半会不一定能找到.比如本人最近对smartfoxserver搭建的服务器做压测的时候,发现最大等待线程数超过20就会打印错误日志,然后就一直在smartfoxserver接受请求的反编译代码里找该错误输出,花了很长时间一直没找到.然后我在想能否用inputstream来查询字符串,试验代码如下: import java.io.BufferedRead

C# 字符串转组件名、变量名

字符串转组件名 (Controls["button1"] as Button).Text = "Hello";//单独组件 (Controls["tabControl1"].Controls[0].Controls["DataSource1"] as TextBox).Text = "111.111.111.111";//嵌套组件 字符串转变量名 string str = "demo";

Python数据类型-----数字&字符串

Python数字类型 int类型表示的范围:-2147483648至2147483648之间,超出这个范围的数字即视为long(长整形) 在Python中不需要事先声明数据类型,它是根据具体的赋值来进行盘点数据类型的,例如: int类型 使用type(变量名) 可以查看该变量被赋值后的数据类型是什么 超出int范围的数字 int类型存储为long类型 只需要在后面加上大写字母L 在python中还支持复数类型 复数类型 Python字符串类型 # coding=UTF-8 #简单定义简单字符串