如何在python中的函数之间共享变量?

时间:2017-01-13 14:30:04

标签: python function variables input

我有两个函数fun1fun2,它们分别作为输入字符串和数字。这两者都得到相同的变量a作为输入。这是代码:

a = ['A','X','R','N','L']

def fun1(string,vect):
    out = []
    for letter in vect:
        out. append(string+letter)
    return out

def fun2(number,vect):
    out = []
    for letter in vect:
        out.append(str(number)+letter)
    return out

x = fun1('Hello ',a)
y = fun2(2,a)

这些函数执行一些无意义的操作。我的目标是以这样的方式重写代码,即变量a在函数之间共享,这样它们就不再将它作为输入。

删除变量a作为输入的一种方法是在函数本身中定义它,但不幸的是,这不是很优雅。 你能建议我达成目标的可行方法吗?

函数应该以相同的方式操作,但输入参数应该只是字符串和数字(​​fun1(string)fun2(number))。

5 个答案:

答案 0 :(得分:11)

面向对象的编程在这里有所帮助:

class MyClass(object):
    def __init__(self):
        self.a = ['A','X','R','N','L']  # Shared instance member :D

    def fun1(self, string):
        out = []
        for letter in self.a:
            out.append(string+letter)
        return out

    def fun2(self, number):
        out = []
        for letter in self.a:
            out.append(str(number)+letter)
        return out

a = MyClass()
x = a.fun1('Hello ')
y = a.fun2(2)

答案 1 :(得分:9)

使用类的替代方法: 您可以使用全局键盘来使用函数外部的变量。

a = 5
def func():
    global a
    return a+1

print (func())

这将打印6

但是应尽可能避免使用全局变量

答案 2 :(得分:5)

由于a在函数范围之外定义,在定义函数之前,您不需要将其作为参数提供,您只需使用a即可。 Python首先会查看变量是否在函数范围内定义,如果没有,它会超出该范围。

a = ['A','X','R','N','L']

def fun1(string):
    out = []
    for letter in a:
        out.append(string+letter)
    return out

def fun2(number):
    out = []
    for letter in a:
        out.append(str(number)+letter)
    return out

x = fun1('Hello ')
y = fun2(2)

在这种情况下,您还可以将函数重写为更优雅的列表推导:

a = ['A','X','R','N','L']

def fun1(string):
    return [string+letter for letter in a]

def fun2(number):
    return [str(number)+letter for letter in a]

x = fun1('Hello ')
y = fun2(2)

答案 3 :(得分:0)

使用global关键字可以轻松实现。这使得a变量在整个文件中可用。但是,应尽可能避免使用全局变量,因为每个函数都可以访问这些全局变量,因此越来越难弄清哪个函数实际读写这些变量。

a = ['A','X','R','N','L']

def fun1(string):
    out = []
    for letter in a:
        out. append(string+letter)
    return out

def fun2(number):
    out = []
    for letter in a:
        out.append(str(number)+letter)
    return out

x = fun1('Hello ')
y = fun2(2,a)

答案 4 :(得分:0)

Object Oriented Programming并将a设置为成员变量绝对是这里的最佳解决方案。

但是有时候您的代码不是OO,例如,当您有多个端点希望共享某些值时,请考虑一下flask应用程序。 在这种情况下,共享或全局变量是解决之道。意思是在所有方法的范围之外定义变量,以便可以在任何地方访问它。

现在,如果变量的值永不改变,则可以使用大写字母命名,以将其标记为final并在某种意义上将其标记为全局(类似于Java中的final静态变量)。

A = ['A','X','R','N','L']

但是如果值确实发生变化,则首先,名称应为小写 a = ['A','X','R','N','L']。其次,您希望将值可以更改的位置限制在理想的范围内,只限于一种方法,然后可以使用global关键字更改值

a = ['A','X','R','N','L']

def fun1(string,vect):
    global a
    a.append('W')

    out = []
    for letter in vect:
        out. append(string+letter)
    return out

def fun2(number,vect):
    out = []
    for letter in vect:
        out.append(str(number)+letter)
    return out

x = fun1('Hello ',a)
y = fun2(2,a)

如果您发现自己在代码中的多个位置更改了a的值,则共享/全局变量可能不是您想要的,而是应该将值作为参数传递给周围。