玩蛇网提供最新Python编程技术信息以及Python资源下载!

python3中动态变量设置实例

我是初学。在python3中,使用

for i in range(3):
    locals()['part' + str(i)] = i
print(part0)
print(part1)
print(part2)

能够得到三个动态生成的变量part0,part1和part2
但是把上面代码包含到一个函数中

def Main():
    for i in range(3):
        locals()['part'+str(i)] = i
    print(part0)
    print(part1)
    print(part2)

Main()

却会报错,说变量part0没有被定义呢?

先看一段代码

print locals
'''输出的是
{'__builtins__': <module '__builtin__' (built-in)>, '__name__':'__main__', '__doc__': None, '__package__': None}
'''
a = 1
print locals()
'''
输出是
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'a': 1, '__package__': None}
注意:多了一个'a':1
'''
def b():
    print locals()
b()
'''
输出是
{}
'''
def b():
    c = 1
    print locals()
b()
'''
输出是
{'c':1}
'''

至此你应该明白locals实际上是表示当前作用域的含义。
那么再来执行一段代码

print locals()
locals()['test'] = 1
print locals()
print test

输出是:

{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'test': 1, '__doc__': None, '__package__': None}
1

这时候就动态的增加了变量test。但是注意,这里是在最外层,也就是全局作用域下利用locals()增加了变量定义。
那么为什么在你的代码中,通过locals()动态增加变量会报错呢?

注意:这里搜索局部名字空间并不是搜索locals(),因此在局部空间的locals()中添加变量并不会被python搜索到。实际上在在局部作用域下,locals是一个可读函数来输出该局部作用域下定义的变量,python内部并没有读locals()来寻找变量名,而且通过locals来更改变量值也是不可行的,代码如下

def a():
    b = 1
    locals()['b'] = 2
    print b
a()  #输出为1

至此,解释了为什么在你的代码中会报part0未定义的错误了。

那么,怎样才可以动态增加变量呢?可以通过globals()['new_var']来增加,但是注意,这里增加的全局变量,慎用啊。代码如下:

def a():
    for i in range(3):
        globals()['part' + str(i)] = i
    print part0
    print part1
    print part2
a()
print part0
'''
输出为:
0
1
2
0
'''

至于如何动态局部作用域下增加变量,这个我还真不清楚,不过你可以变通一下,定义一个字典变量,然后赋值给它就好了嘛,代码如下:

def a():
    b = {}
    for i in range(3):
        b['part' + str(i)] = i
    print b['part0']
    print b['part1']
    print b['part2']
a()
'''
输出为:
0
1
2
'''

默认的情况下下,globals()是可以直接用dict来操作的,但是locals()并不一样,可以先认为locals()是一个只读的dict(或者是没有写回作用的dict),只能知道你当前的代码的局部变量,但是无法通过修改locals() 使之生效

如果用exec在执行代码时,指定一个dict作为这这段代码的locals,是可以修改的

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd19855.html

相关文章 Recommend

玩蛇网Python互助QQ群,欢迎加入-->: 106381465 玩蛇网Python新手群
修订日期:2017年05月24日 - 19时09分00秒 发布自玩蛇网

您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容
我要分享到:

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules