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 字符串与变量连接

python中变量和字符串的连接 字符串中加含变量,一定要内外包围相同。 如下输出: table='abc' str1='select * from '+table+'' str2="...

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

转载网址:http://www.jb51.net/article/49762.htm

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

一共三种方法: >>> var = "This is a string" >>> varName = 'var' >>> s= locals()[varName] >>> s 'Th...
  • ztf312
  • ztf312
  • 2016-04-11 15:37
  • 7841

python获取变量的数据类型

有时候我们需要知道variable的数据类型,在python中有内置函数type可以获取variable的数据类型 #-*- coding=utf-8 -*- id1 = 1 typestr = ...
  • bytxl
  • bytxl
  • 2014-03-12 10:15
  • 1704

Python 如何根据变量得到变量名

应用场景:https://github.com/gt11799/Direcited_graph

Xcode中修改变量名、类名及字符串的替换操作

在做iOS开发代码优化的工作时,优化代码结构之前,我们应该先整理好工程的外貌,将文件和类的命名进行规范,在Xcode中为我们提供了方便而强大的名称修改功能。 第一步:修改类名       ...

xcode中查找、修改变量名,类名及字符串的替换操作

1 查找字符串,find–>find ,输入要查找的字符串名 2 修改类名 将鼠标点击放在类的名称上,选择Xcode工具栏中的edit->refactor->rename: 之后,将类名更...

『Python』序列学习总结之六——如何命名规范的变量名

本内容主要参考《Python高级编程》以及自己的一些实践、公司的命名规范。 对于那些认为随便取个变量名也无所谓、只要自己看得懂的人, 请无视本文章。本文章的核心观点是: 代码应该便于阅读和理解、 好的...
  • Sbtgmz
  • Sbtgmz
  • 2016-05-03 13:23
  • 1359

Python 命名空间 及变量搜索规则 属性名称 属性名称 无点号运算的变量名

无点号运算的变量名与作用域相对应 点号的属性名使用的是对象的命名空间 有些作用域会对对象的命名空间进行初始化(模块和类) 简单变量名:如果赋值就不是全局变量 无点号的简单变量名遵循函数的LEGB...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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