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

转载 2016年08月30日 15:23:54

一共三种方法:

[python] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  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'  
1locals()

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

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

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

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

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

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

locals与globals的区别

  • locals()是只读的。globals()不是。这里说的只读,是值对于原有变量的只读。其实还可以对locals()赋值的。
  • globals返回的是当前模块的全局变量 locals返回的是局部变量。注意,locals返回的是当前所在最小命名空间的局部变量的一个拷贝
体检locals
[python] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. list1 = [1,2,3]  
  2. locals()  
  3.   
  4. # 在全局中使用locals,会打印出list1和__builtins__、__name__、__doc__、__package__  
  5. 复制代码  
  6. def foo(args):  
  7.     x=1  
  8.     print locals()  
  9.   
  10. foo(123)  
  11.   
  12. #将会得到 {'arg':123,'x':1}  
2. vars()

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

[python] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. #vars()    
  2.     
  3. print(vars())    
  4.     
  5. class Foo:    
  6.     a = 1    
  7. print(vars(Foo))    
  8.     
  9. foo = Foo()    
  10. print(vars(foo))   
3. eval()

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

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

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

[python] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"  
  2. b = eval(a)  
  3. b  
  4. Out[3]: [[12], [34], [56], [78], [90]]  
  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]: ([12], [34], [56], [78], (90))  
强大的函数有代价。安全性是其最大的缺点。

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

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

__import__('os').system('dir')

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

那么继续输入:

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

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

怎么避免安全问题?

(1) 自行写检查函数;

(2) 使用ast.literal_eval

Python中使用动态变量名的方法

转载网址:http://www.jb51.net/article/49762.htm
  • a2011480169
  • a2011480169
  • 2017年09月04日 16:07
  • 1003

python2动态变量的实现

刚学python不久,最近用python编写公司服务器的一个备份脚本,期间遇到动态变量的问题,然后各种baidu,google。终于发现了两个重要的变量locals()和globals()。 >>> ...
  • baidu_35468897
  • baidu_35468897
  • 2016年12月15日 16:09
  • 232

python动态生成变量

今日发现一个新函数 enumerate 。一般情况下对一个列表或数组既要遍历索引又要遍历元素时,会这样写: for i in range (0 , len (list )):      p...
  • maoyongfan3
  • maoyongfan3
  • 2015年03月30日 15:18
  • 1177

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

一共三种方法:>>> var = "This is a string" >>> varName = 'var' >>> s= locals()[varName] >>> s 'This is a st...
  • ztf312
  • ztf312
  • 2016年04月11日 15:37
  • 10925

python字符串转换成变量的几种方法

转自:http://blog.chinaunix.net/uid-20393955-id-345573.html 2011-4-18 磁针石 #承接软件自动化实施与培训等gtalk: ouya...
  • mlgglm
  • mlgglm
  • 2016年09月08日 15:37
  • 1708

python 字符串与变量连接

python中变量和字符串的连接 字符串中加含变量,一定要内外包围相同。 如下输出: table='abc' str1='select * from '+table+'' str2="...
  • a6225301
  • a6225301
  • 2015年09月30日 15:33
  • 9030

Python中变量的命名和使用

在Python中使用变量时,和c++一样也需要符合一定的命名规则; 变量名只能包含字母、数字、下划线,变量名可以以字母和下划线开头,但不能以数字开头。 例如:m12_、_m12都可以,但是...
  • mars_xiaolei
  • mars_xiaolei
  • 2017年09月04日 18:56
  • 176

python 字符串插入变量

字符串中插入变量 Python并没有对在字符串中简单替换变量值提供直接的支持。 但是通过使用字符串的 format() 方法来解决这个问题。比如: >>> s = '{name...
  • w2008145338
  • w2008145338
  • 2015年05月14日 21:15
  • 3016

Python中的类变量和成员变量

本文实例形式讲解了python的类变量和成员变量用法,对于Python程序设计有一定的参考价值。分享给大家供大家参考。具体如下: 先看看下面这段代码: ? 1 2 ...
  • gzhouc
  • gzhouc
  • 2015年07月07日 10:21
  • 43494

变量和字符串拼接

python学习笔记(三) 练习3.数字和数学计算 print "I will now  countmy chickens:" print "Hens",25+30/6 pri...
  • u012371936
  • u012371936
  • 2016年08月12日 21:44
  • 2722
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python:如何将字符串作为变量名
举报原因:
原因补充:

(最多只允许输入30个字)