Python exec()命令在IDLE中工作,而不是在程序中工作

时间:2013-12-14 23:04:00

标签: python python-3.x python-idle

我想重新分配用户选择的变量的值。我们的想法是,如果用户选择此变量,则该变量的值将设置为零。

代码如下所示:

v1 = 8.4
v2 = 12.1
v3 = 36.2

list = ['', 'v1=', 'v2=', 'v3=']

print("What v do you want to be zero?")
print("    1 = v1")
print("    2 = v2")
print("    3 = v3")
a = eval(input("Enter your choice: "))

(用户输入1)

b = list[a] + '0'
exec(b)
print(v1, v2, v3)

当我在IDLE中逐行输入此代码时,我得到:

0 12.1 36.2

但是,当我在一个函数中运行相同的代码时(*所以exec()和print(v1,v2,v3)语句在同一个函数内),我得到:

8.4 12.1 36.2

任何人都能解释一下吗?我认为这可能是一种可怕的方式来做我正在做的事情(我是编码的新手),我欢迎你提出如何做得更好的建议,也许是一个循环或一系列'if / elif'陈述?但是,我真正想知道的是,为什么这个代码在逐行输入时起作用,而不是作为一个函数。

(* =编辑)

这是一个不重新分配任何变量的程序:

# delete me.py

def main():

    v1 = 8.4
    v2 = 12.1
    v3 = 36.2

    list = ['', 'v1=', 'v2=', 'v3=']

    print("What v do you want to be zero?")
    print("    1 = v1")
    print("    2 = v2")
    print("    3 = v3")
    a = eval(input("Enter your choice: "))

    b = list[a] + '0'
    exec(b)

    print(v1, v2, v3)

main()

2 个答案:

答案 0 :(得分:2)

理解这一点的最简单方法是不允许您通过exec修改变量。它有时会起作用,但它并不是真正允许的,而且从来都不是一个好主意。

对于这段代码,你应该写:

v = [8.4, 12.1, 36.2]
print("What v do you want to be zero?")
print("    1 = v1")
print("    2 = v2")
print("    3 = v3")
a = int(input("Enter your choice: "))
v[a - 1] = 0
print(v)

基本上,如果您需要通过用户输入查找变量,它应该在列表或字典中。您永远不需要为局部变量执行此操作。

答案 1 :(得分:0)

这是因为您正在更新运行exec的函数的本地范围。

比较一下:

v = 42
def f(): v = 43 #which is inside you exec
f()
print(v)