添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

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

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

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

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

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

locals与globals的区别

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

体检locals

list1 = [1,2,3]
locals()
# 在全局中使用locals,会打印出list1和__builtins__、__name__、__doc__、__package__
def foo(args):
    print locals()
foo(123)
#将会得到 {'arg':123,'x':1}

2. vars()

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

#vars()  
print(vars())  
class Foo:  
    a = 1  
print(vars(Foo))  
foo = Foo()  
print(vars(foo)) 

3. eval()

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

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

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

a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
b = eval(a)
Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
type(b)
Out[4]: list
a = "{1: 'a', 2: 'b'}"
b = eval(a)
Out[7]: {1: 'a', 2: 'b'}
type(b)
Out[8]: dict
a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
b = eval(a)
Out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))

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

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

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

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

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

那么继续输入:

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

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

怎么避免安全问题?

(1) 自行写检查函数;

(2) 使用ast.literal_eval

eval() 和exec()

  • 区别是eval()有返回值

1

2

3

4

5

def test1():

print "Test1 Excuted!"

return True

ret = eval ( "test1()" )

print ret

1

2

3

>>>

Test1 Excuted!

True

  • 而exec()只执行,并无返回值。

1

2

3

4

def test2():

print "Test2 Excuted!"

return True

exec ( "test2()" )

1

2

3

>>>

Test2 Excuted!

>>>

  • 如果要将exec()赋值,会有以下语法错误!

1

ret = exec ( "test2()" )

一共三种方法:>>> var = "This is a string">>> varName = 'var'>>> s= locals()[varName]>>> s'This is a string'>>> s2=vars()[varName]>>> s2'Thi... 把一个值赋值给一个名字是,它会储存在内存当中,把这块内存称为 变量 (variable),在大多数的语言中,都把这种行为称为“给 变量 赋值”或“把值存储在 变量 中”。 不过, Python 与其他计算机语言的做法稍早有不同,它并不是八只存储在 变量 中,而更像是把名字“贴”在值上边。所以有些 Python 程序员会说 Python 没有 变量 ,只有名字。 变量 就是一个名字,通过这个名字,我们能找到我们想要的东西。\nteacher='\u5c0f\u4e4c\u9f9f' print(teacher) 变量 为什么不叫“恒量”而是叫 变量 ?正是因为它是可以变的! z=x+y print(z)
1. locals() locals是 python 的内置函数,他可以以字典的方式去访问局部和全局 变量 python 里面用名字空间记录着 变量 ,就像javascript的window一样,他记录着各种全局 变量 。 每个模块,每个函数都有自己的名字空间,记录着 变量 ,常量,类的命名和值。 就像JS一样,当 python 在使用 变量 时,会按照下面的步骤去搜索: 函数或类的局部 变量 。 全局 变量 。 内置 变量 。 以上三个步骤,其中一步骤找到对应的 变量 ,就不会再往下找。如果在这三个步骤都找不到,就会抛出异常。 2.vars()
如何动态生成 变量名 ? 相信大多数同学在看到本文标题后内心是疑惑的,到底什么样的场景下会遇到这种需求呢?接下来我们通过技术讨论群抛出的问题以及一系列答案做一个分析,并由此引申到更进一步的学习话题,希望对各位同学有所帮助。 首先,M同学的问题如下: 打扰一下大家,请教个问题,已知list = ['A', 'B', 'C', 'D'], 如何才能得到以list中元素命名的新列表A = [], B =...
3. 标识符不能是 Python 的关键字和保留字(如if、while、for等)。 因此,在 Python 的代码中,中文字符不能直接作为标识符的一部分,需要使用英文字母、数字和下划线来命名 变量 、函数等。如果需要在代码中使用中文字符,可以将其包含在 字符串 中,例如: ``` python msg = "这是一条中文消息。" print(msg) 输出:这是一条中文消息。
【Python】Python-numpy逻辑报错:The truth value of an array with more than one element is ambiguous. Us 144275 报错:WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after con Z.风止: 关掉梯子也有…… 【PSO】PSO算法测试函数集CEC2013的demo加注释解析 weixin_49310410: 好厉害,膜拜大佬 【Python】LDA使用LatentDirichletAll报错TypeError: __init__() got an unexpected keyword argument ‘n_topics‘ 2301_78112219: 报错出现__init__() got an unexpected keyword argument n_components怎么解决呀 【机器学习】sklearn-GBDT调参-GradientBoostingClassifier m0_51406412: 这个为啥后面就不用交叉验证了呢? 【PSO】离散粒子群算法(DPSO)和离散二进制粒子群算法(BPSO ) weixin_49654031: 你好,请问你解决这个问题了吗