Python 从另一个函数访问函数中声明的变量

Python 从另一个函数访问函数中声明的变量,python,Python,如何从另一个在main内部调用的函数子函数访问函数main的局部变量x 下面的MEW抛出一个错误NameError:在运行脚本时未定义全局名称“x” 如果我在main中添加全局x,l,就不会再有错误了,但我不想让这些变量成为全局变量 MWE: Edit1我正在编辑一个现有的代码,我不想改变函数的算术性将参数作为参数传递,以实现您想要的功能 def sub(x, l): print "x from main: {}".format(x) print "l from main: {}

如何从另一个在main内部调用的函数子函数访问函数main的局部变量x

下面的MEW抛出一个错误NameError:在运行脚本时未定义全局名称“x”

如果我在main中添加全局x,l,就不会再有错误了,但我不想让这些变量成为全局变量

MWE:


Edit1我正在编辑一个现有的代码,我不想改变函数的算术性

将参数作为参数传递,以实现您想要的功能

def sub(x, l):
    print "x from main: {}".format(x)
    print "l from main: {}".format(l)


def main(z):
    x = 5
    l = [1,2,3,4,5]
    print "z from top: {}".format(z)
    sub(x, l)


if __name__ == "__main__":
    z = 'SOME'
    main(z)
这张照片是:

z from top: SOME
x from main: 5
l from main: [1, 2, 3, 4, 5]
如果您不想使用这种方法,我想您可以遵循answer的方法,尽管在这种情况下似乎很复杂

import inspect

z = 'SOME'

def sub():
    frame = inspect.currentframe()
    locales = None
    try: locales = frame.f_back.f_locals
    finally: del frame
    if locales:
        for k, v in locales.items():
            print("{} from main: {}".format(k, v))


def main():
    x = 5
    l = [1,2,3,4,5]
    print("z from top: {}".format(z))
    sub()

main(z)
如果你能把它变成一个上下文管理器,也许这会更干净

也可以使用*args和*kwargs

从这里可以将值指定给局部变量

在功能范围内

或者使用dict.get,这样您可以设置默认值:

l = kwargs.get('l', None)

将参数作为参数传递可以得到所需的操作

def sub(x, l):
    print "x from main: {}".format(x)
    print "l from main: {}".format(l)


def main(z):
    x = 5
    l = [1,2,3,4,5]
    print "z from top: {}".format(z)
    sub(x, l)


if __name__ == "__main__":
    z = 'SOME'
    main(z)
这张照片是:

z from top: SOME
x from main: 5
l from main: [1, 2, 3, 4, 5]
如果您不想使用这种方法,我想您可以遵循answer的方法,尽管在这种情况下似乎很复杂

import inspect

z = 'SOME'

def sub():
    frame = inspect.currentframe()
    locales = None
    try: locales = frame.f_back.f_locals
    finally: del frame
    if locales:
        for k, v in locales.items():
            print("{} from main: {}".format(k, v))


def main():
    x = 5
    l = [1,2,3,4,5]
    print("z from top: {}".format(z))
    sub()

main(z)
如果你能把它变成一个上下文管理器,也许这会更干净

也可以使用*args和*kwargs

从这里可以将值指定给局部变量

在功能范围内

或者使用dict.get,这样您可以设置默认值:

l = kwargs.get('l', None)

做你想做的事情的最好方法,也需要最少的改变。只要改变你声明变量的方式;通过在变量名之前添加函数名,您可以从代码中的任何位置访问变量

def sub():
    print "x from main: {}".format(main.x)
    print "l from main: {}".format(main.l)

def main():
    main.x = 5
    main.l = [1,2,3,4,5]
    print "z from top: {}".format(z)
    sub()

if __name__ == "__main__":
    z = 'SOME'
    main()
这将打印:

z from top: SOME
x from main: 5
l from main: [1, 2, 3, 4, 5]

做你想做的事情的最好方法,也需要最少的改变。只要改变你声明变量的方式;通过在变量名之前添加函数名,您可以从代码中的任何位置访问变量

def sub():
    print "x from main: {}".format(main.x)
    print "l from main: {}".format(main.l)

def main():
    main.x = 5
    main.l = [1,2,3,4,5]
    print "z from top: {}".format(z)
    sub()

if __name__ == "__main__":
    z = 'SOME'
    main()
这将打印:

z from top: SOME
x from main: 5
l from main: [1, 2, 3, 4, 5]

将它们作为参数传递给函数。将它们作为参数传递给函数。我正在编辑现有代码,不希望更改函数的算术数。编辑我的应答添加了另一个选项我正在编辑现有代码,不希望更改函数的算术数。编辑我的应答添加了另一个选项