我想重新分配用户选择的变量的值。我们的想法是,如果用户选择此变量,则该变量的值将设置为零。
代码如下所示:
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()
答案 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)