如何将 value 声明为 none 并重新声明它,然后将其用于 python 中的 if 语句? [已关闭]

问题描述 投票:0回答:2

我的问题很简单我该怎么做

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:
        ...

当我这样做时发生的事情是: 类型错误:“NoneType”类型的参数不可迭代

我正在做的是创建一个 Alexa,它要求接受命令然后执行命令。命令的变量设置为等于人所说的,但在Python中,它不喜欢有一个没有类型的变量,所以我说不,然后说我会重新声明它,但它不起作用,

python function variables pycharm speech-recognition
2个回答
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()

-1
投票

我相信您对

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'

TL;DR:首先,您需要在某处(在全局范围内)声明全局变量。

在您的特定情况下,您的代码需要变为:

# declare command in the global namespace
command = None

def user_commands():
    ... 
    return command

def run_alexa():
    # modify (pre-existing) global var
    global command
    command = user_commands()

该命令需要是一个全局变量,然后才能生效。

© www.soinside.com 2019 - 2024. All rights reserved.