在while循环中从定义的函数访问一个变量

3
我有类似于这样的代码
v = '0'

def program():
    x = input('1 or 2 ')
    if x == '1':
        print('it is 1')
        v = '1'
    elif x == '2':
        print('it is 2')
        v = '2'

while True:
    program()
    print(v)

然而,当我运行这段代码时,变量“v”总是打印出默认的0。为什么它没有给我在函数中分配的变量?

你使用的是哪个版本? - pzp
1
你可以在这里找到一个很好的答案:https://dev59.com/_3NA5IYBdhLWcg3wgeOk - Florent Chatterji
4个回答

3
你有两个名为 v 的变量:
  1. 在顶部的全局级别声明 v=0
  2. 在程序中函数声明的 v
首先,你真的不应该在函数中使用全局变量,因为这是不好的编程习惯。你应该将其作为参数传递,并将其与其他结果一起返回。
如果你确实需要,在函数中修改全局变量,你需要先将其声明为全局变量。
此外,请注意在 Python 2 中需要使用 raw_input
def program():
    global v
    x = raw_input('1 or 2 ')
    if x == '1':
        print('it is 1')
        v = '1'
    elif x == '2':
        print('it is 2')
        v = '2'

在其他函数中使用全局变量


1
很好的解释。在提到不良实践时做得很好。 - idjaw

2

你的函数操作的是变量 v 的本地副本。如果你想在调用 program() 后获取 v 的值,请在函数定义的末尾添加 return v

v = '0'

def program():
    x = input('1 or 2 ')
    if x == '1':
        print('it is 1')
        v = '1'
    elif x == '2':
        print('it is 2')
        v = '2'
    return v

while True:
    v = program()
    print(v)

如果您不想返回任何内容,可以将v设置为全局声明变量,如下所示:
v = '0'

def program():
    x = input('1 or 2 ')
    if x == '1':
        print('it is 1')
        global v
        v = '1'
    elif x == '2':
        print('it is 2')
        global v
        v = '2'

while True:
    program()
    print(v)

1
为了补充duplicate标志,以下是与您的代码相关的说明:
您需要明确告诉您的方法,您想使用全局变量“v”,否则它将永远不会从方法范围内发生的“v”更新。
为了纠正这个问题,您需要在方法内添加“global v”。
def program():
    global v
    # rest of your code here

那应该可以工作。

1
Python中的变量赋值具有本地作用域。如果您想在函数内部操作全局状态(或封闭状态),可以将该状态包装在一个容器中,然后引用该容器。例如:
v = ['0']

def program():
    x = input('1 or 2 ')
    if x == '1':
        print('it is 1')
        v[0] = '1'
    elif x == '2':
        print('it is 2')
        v[0] = '2'

while True:
    program()
    print(v[0])

上面的代码片段涉及到一个数组,并且操作了数组中的值。

你可能需要解释一下如何改变变量的实际ID,而另一个只是修改变量所引用的对象。 - pzp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接