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

Fed*_*ile 5 python variables input function

我有2个函数fun1,fun2分别作为输入字符串和数字.这两个输入都是相同的变量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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

osp*_*hiu 14

面向对象的编程有助于:

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)
Run Code Online (Sandbox Code Playgroud)

  • 您现在可以删除`vect`参数.;) (2认同)
  • 请注意*这个答案*、*[@Willem Van Onsem 的答案](/sf/answers/2914584571/)* 和*[@involtus 的答案](https://stackoverflow. com/a/51260967/4561887)*,这三个答案都是正确且实用的,所以我都对它们投了赞成票。然而,按照“好”的顺序,*最佳*答案是@ospahiu的这个面向对象的答案,带有共享成员变量,第二个最佳答案是@Willem Van Onsem的答案,它推荐了我可能称之为“自动”的答案。作用域”从内部变量读取外部,@involtus 的“全局”答案是最不推荐的解决方案。 (2认同)

inv*_*tus 11

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

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

print (func())
Run Code Online (Sandbox Code Playgroud)

这将打印6

但应尽可能避免全局变量


Wil*_*sem 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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是推荐还是应该避免? (2认同)
  • @Ev.Kounis:它不是很优雅,因为人们可能会忘记在范围之外定义了一个变量并在函数中引入了一个`a`。所以最好使用面向对象的编程。 (2认同)
  • @Ev.Kounis:它绝对应该避免,除非'a'是一个常数(在整个过程生命周期中不应该改变) - 即使这样,明确地传递'a'(如果你关心可测试性)仍然会更好那是)。 (2认同)