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()
1
2
3
4
5
|
def
test1():
print
"Test1 Excuted!"
return
True
ret
=
eval
(
"test1()"
)
print
ret
|
1
2
3
|
>>>
Test1 Excuted!
True
|
1
2
3
4
|
def
test2():
print
"Test2 Excuted!"
return
True
exec
(
"test2()"
)
|
1
2
3
|
>>>
Test2 Excuted!
>>>
|
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:
【机器学习】sklearn-GBDT调参-GradientBoostingClassifier
m0_51406412:
【PSO】离散粒子群算法(DPSO)和离散二进制粒子群算法(BPSO )
weixin_49654031: