python变量定义问题_python中的动态变量问题

先看一段代码

print locals

'''输出的是

{'__builtins__': , '__name__':'__main__', '__doc__': None, '__package__': None}

'''

a = 1

print locals()

'''

输出是

{'__builtins__': , '__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__': , '__name__': '__main__', '__doc__': None, '__package__': None}

{'__builtins__': , '__name__': '__main__', 'test': 1, '__doc__': None, '__package__': None}

1

这时候就动态的增加了变量test。但是注意,这里是在最外层,也就是全局作用域下利用locals()增加了变量定义。

那么为什么在你的代码中,通过locals()动态增加变量会报错呢?

接下来说一下python寻找变量的机制。

当一行代码要使用变量 x 的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:

局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x,Python将使用这个变量,然后停止搜索。

全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python将使用这个变量然后停止搜索。

内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python将假设 x 是内置函数或变量。

注意:这里搜索局部名字空间并不是搜索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

'''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值