python创建动态变量的两种方法

前两天想用python写个脚本,里面需要自动创建一系列的空列表,经过搜索发现两种方法可以:

方法1、用 exec() 函数。

它的作用是 exec 执行储存在字符串或文件中的 Python 语句。
例如:

# exec(source, globals=None, locals=None, /)
# 上面参数最后的‘/’,表示exec只接收位置参数,参数类型为字典。
# source: 为字符串,是供exec执行的代码。
# globals:全局变量。参数可为 globals()
# locals: 局部变量。参数可为 locals(),也可以为一个自定义字典。


# 1、没有 globals 和 locals 参数。
def fun_1():
    a = 1
    exec('b= 2')
    exec('c = 3')
    exec('print(locals())')     # 结果为: {'a': 1, 'b': 2, 'c': 3}
    print(locals())               # 结果为: {'a': 1, 'b': 2, 'c': 3},两个结果一样。

    exec('print(a+c)')          # 结果为:4。说明 exec能调用 变量 a。

    #print(a+c)                    # NameError: name 'c' is not defined
                                       # 说明在外部不能调用exec中的变量。
    
fun_1()


print('==========================', end='\n\n')


# 2、只有一个locals 的位置参数。
def fun_2():
    a = 1
    exec("b=2", None, locals())
    exec('c = 3')

    exec('print(locals())')    # 结果为:{'a': 1, 'b': 2, 'c': 3}
    print(locals())               # 结果为:{'a': 1, 'b': 2, 'c': 3}  两个一样。

    #print(a+b)                   # NameError: name 'b' is not defined
                                       # 说明在外部不能调用exec中的变量。
       
fun_2()

print('=========================', end='\n\n')

# 3、只有一个globals的位置参数。
def fun_3():
    a = 1
    exec('b= 2', globals())

    print(a+b)                  #  结果为:3。说明此时可以调用变量‘b’了。
    
    print(globals())            # 结果为: {'__name__': '__main__', … , 'b': 2}
                                      # 说明全局变量中有变量‘b’。


    
fun_3()


print('=========================', end='\n\n')


# 4、有globals 和 locals 的位置参数。
def fun_4():
    a = 1
    exec("c=3", globals(), locals())

    exec('print(locals())')    # 结果为:{'a': 1, 'c': 3}
    
    print(globals())            # 全局变量中没有‘c’。
                                      # 说明当两个参数共同存在时, exec创建的变量
                                      #只存在于局部变量中,不会存到全局变量中。                                      
fun_4()

在exec()里用 三对引号括起来,也可以执行多行文本代码,如下:

for i in range(1,6):
	exec('''list_{}=[]
list_{}.append({})'''.format(i,i,i*2))

结果为: list_1 = [2],list_2 = [4] …… list_5 = [10]

方法2:用locals() 或者 globals()

def test_locals():
    a = 1
    b = 2
    
    locals()['c'] = 3
    print(locals())        # 打印为:{'b': 2, 'a': 1, 'c': 3},说明可以动态的添加局部变量。

    locals()['b'] = 10    # 尝试在局部域中修改“赋值”变量的值……
    locals()['c'] = 30    # 尝试在局部域中修改“动态”变量的值……
    print(locals())        # 打印为:{'b': 2, 'a': 1, 'c': 30}, ‘b’ 的值没变,'c'变了。

test_locals()

# 结论:locals()中的变量,无法改变”赋值“的变量的值(例如上面的 a=1),
# 但可以改变以字典键值对方式动态添加的值。

用globals 可以:

a = 1
def test_globals():
    b = 2
    globals()['c'] = 3
    print(globals())        # 打印为:{…, 'a': 1,  …, 'c': 3}, 没有‘b’。
    
    globals()['a'] = 10
    globals()['c'] = 30
    print(globals())       # 打印为:{…, 'a': 10,  …, 'c': 30},'a' 和 'c' 都被修改了。

test_globals()

locals()的详细参考:

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值