Python 更新函数外部的空变量

Python 更新函数外部的空变量,python,string,function,variables,Python,String,Function,Variables,我试图弄清楚如何在Python中更新函数外部的空变量。这样做的原因是创建一个循环,向用户查询他们能够添加的其他参数 到目前为止,我看到的是: param1 = "" param 2 = "" typeans = ['parameter 1', 'param 2'] typeansa = ['parameter 2', 'param 2'] def addparams(): while True: again = raw_input('Would you like to

我试图弄清楚如何在Python中更新函数外部的空变量。这样做的原因是创建一个循环,向用户查询他们能够添加的其他参数

到目前为止,我看到的是:

param1 = ""
param 2 = ""
typeans = ['parameter 1', 'param 2']
typeansa = ['parameter 2', 'param 2']

def addparams():
    while True:
        again = raw_input('Would you like to add another parameter? Enter y/n: ')
        if again == "n":
            break
        if again == "y":
        additionalparams = raw_input("Would you like to add any other parameters? (Parameter 1, Parameter 2): ")
            if additionalparams.lower() in typeans:
                param1 = raw_input('Please enter the first search criteria: ')
                param1.update() = param1+"one"
            elif additionalparams.lower() in typeansa:
                param2 = raw_input('Please enter the second search criteria: ')
                param2.update() = param2+"two"
            addparams()
addparams()
url = www.website.com/+param1+param2
这段代码的目的是允许我查询用户是否有其他参数,然后将它们添加到url/uri中。我在函数外留空的原因是,如果用户在我的实际代码中只选择使用一个或几个变量,那么我有7个参数

我理解这可能不是解决这个问题的最佳方式,并将非常感谢任何建议。我是Python新手,欢迎任何帮助


谢谢

你应该看看这本书,直接回答你的问题

def addparams():
    global param1
    global param2
    ...
除此之外,我必须说,您的代码还有一个奇怪的缩进和一些打字错误:param 2在Python中不是有效的名称,typean的第二项可能是'param 1',您在循环中还有一个对addparams的额外调用。最后,我不知道param1.update是什么。它应该看起来像:

param1 = ""
param2 = ""
def addparams():
    global param1
    global param2
    typeans = ['parameter 1', 'param 1']
    typeansa = ['parameter 2', 'param 2']
    while True:
        again = raw_input('Would you like to add another parameter? Enter y/n: ')
        if again == "n":
            break
        if again == "y":
            additionalparams = raw_input("Would you like to add any other parameters? (Parameter 1, Parameter 2): ")
            if additionalparams.lower() in typeans:
                param1 = raw_input('Please enter the first search criteria: ')
                param1 = param1+"one"
            elif additionalparams.lower() in typeansa:
                param2 = raw_input('Please enter the second search criteria: ')
                param2 = param2+"two"
然而,这不一定是最好的方式;我宁愿从函数返回参数列表:

def addparams():
    param1 = ''
    param2 = ''
    typeans = ['parameter 1', 'param 1']
    typeansa = ['parameter 2', 'param 2']
    while True:
        [...] # same code as above
    return param1, param2

param1, param2 = addparams()
url = 'www.website.com/'+param1+param2 # not sure that's the url you want
您可能希望进一步实际返回完整的url:

def createURL():
    param1 = ''
    param2 = ''
    typeans = ['parameter 1', 'param 1']
    typeansa = ['parameter 2', 'param 2']
    while True:
        again = raw_input('Would you like to add another parameter? Enter y/n: ')
        if again == "n":
            break
        if again == "y":
            additionalparams = raw_input("Would you like to add any other parameters? (Parameter 1, Parameter 2): ")
            if additionalparams.lower() in typeans:
                param1 = raw_input('Please enter the first search criteria: ')
                param1 = param1+"one"
            elif additionalparams.lower() in typeansa:
                param2 = raw_input('Please enter the second search criteria: ')
                param2 = param2+"two"
    return 'www.website.com/'+param1+param2

url = createURL()

没有更大的参照系,它听起来可能是完全切线的,但是你可以考虑简单地在一个函数中构建整个目的地,而摆脱了更新外部变量的整个问题。

def get_params():
    target = 'http://www.example.com'
    asking = True
    while asking:
        next_param = raw_input('Add another param? Y/N')
        if 'y' in next_param.lower():
            target += "/{}".format(raw_input('Enter parameter: '))
        else:
            asking = False
    return target
如果您需要单独存储每个参数,那么您可以让它返回一个参数列表,然后在返回的参数列表中使用“/”.joinx表示x。这将有一个额外的好处,即为您提供参数列表和最终搜索字符串,而不必让所有这些全局变量四处浮动

def get_list_of_params():
    target = ['http://www.example.com']
    asking = True
    while asking:
        next_param = raw_input('Add another param? Y/N')
        if 'y' in next_param.lower():
            target.append(raw_input('Enter parameter: '))
        else:
            asking = False
    return target
您将按如下方式使用:

param_list = get_list_of_params()
search_string = '/'.join(param_list)

这样,您就不用设置全局变量以在其他地方进行更改,而只需使用已准备就绪的返回值。

为什么不使用*args或**kwargs作为可选参数?您好,letsc。谢谢你的回复。我对*args或**kwargs都不熟悉,您能更详细地解释一下吗?虽然技术上是正确的,教新程序员用global解决所有问题并不是一个好主意。这里没有人声称global应该解决所有问题,但它是OP问题的直接解决方案,而关于*args和**kwargs的评论超出了范围。此外,我还添加了更多的信息/修复和替代解决方案。我没有使用global,而是在函数中移动了参数,解决了我的问题,我感谢大家的帮助!