如何在Python中声明值为None,然后重新声明并在if语句中使用?

-1 投票
2 回答
71 浏览
提问于 2025-04-14 17:32

我的问题很简单,怎么在Python里先把一个值声明为None,然后再重新声明它,最后用它来做一个if判断?

global command
command = None

def user_commands():
    def take_command():
    try:
        with sr.Microphone() as source:
            print('listening...')
            voice = listener.listen(source)
            command = listener.recognize_google(voice)
            command = command.lower()
            if 'alexa' in command:
                command = command.replace('alexa', '')
                print(command)
    except:
        pass
    return command

def run_alexa():
    global command
    command = user_commands()
    ...

    if 'Play' in command:
        ...

当我这样做的时候,出现了这个错误:TypeError: argument of type 'NoneType' is not iterable

我正在做一个Alexa助手,它会询问用户输入命令,然后执行这个命令。命令的变量是根据用户说的话来设置的,但在Python中,变量必须有类型,所以我先把它设为None,然后再重新声明它,但这样做不行。

2 个回答

-1

在你的情况下,你是在设置变量之前就使用了它,这种情况不仅仅发生在global变量上。也就是说,你可能对global这个关键词的用法感到困惑。

global可以让你在一个封闭的范围内创建或修改一个变量,然后这个变量会被提升到全局范围,也就是可以在程序的任何地方使用。

比如,你可以在你的REPL(交互式编程环境)里试试这个:

 >>> foo = "x"
 >>>
 >>> def bar():
 ...     foo = "y"
 ...
 >>> print(foo)
 'x'
 >>> bar()
 >>> print(foo)
 'x'

不过,如果你使用global这个关键词,当你在函数中修改它时,它会被设置为全局变量。

 >>> foo = "x"
 >>>
 >>> def bar():
 ...     global foo
 ...     foo = "y"
 ...
 >>> print(foo)
 'x'
 >>> bar()
 >>> print(foo)
 'y'
1

global 这个关键词可能会让人误解。它并不是用来声明一个全局变量的,而是告诉解释器在未来引用变量时应该使用哪个作用域。让我换个方式来解释:

当你写 global command 的时候,你其实是在说:“解释器,请创建一个名为 command 的全局变量。”但实际上 global command 的意思是:“解释器,每当你在这个函数里看到一个叫做 command 的变量时,你应该去全局作用域找它。”

说到这里,你只需要在全局作用域中定义这个变量(也就是在任何函数外面)。然后,所有想要访问这个全局变量的函数都应该加上 global command 这句话:

command = None

def user_commands():
    ...
    ...
    return command

def run_alexa():
    global command
    command = user_commands()

撰写回答