关于python:向内部函数传递参数

Passing parameter to inner function

我有一个内在的功能。我想知道什么是将变量传递到内部函数的正确方法。从我所看到的情况来看,表是默认传递的,尽管我不确定这是一个未记录的解决方案还是Python设计。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def function():
    def inner_function():
        if a[0] > b[0]:
            print("a[0] = {0}, b[0] = {1}".format(a[0], b[0]))
            tmp = c
            c = d
            d = tmp

    a = [4, 3]
    b = [2, 1]
    c = 1
    d = 2

    inner_function()

function()

python test.py输出:

$ python test.py a[0] = 4, b[0] = 2 Traceback (most recent call last):

File"test.py", line 16, in

function()

1
   File"test.py", line 14, in function

inner_function()

1
   File"test.py", line 5, in inner_function

tmp = c

UnboundLocalError: local variable 'c' referenced before assignment

将变量从"函数"传递到"内部函数"的正确方法是什么?除了按参数,还有其他方法吗?为什么在"c"变量引用上有错误而不是在"a"表上?


afaik c正在抛出一个错误,因为它是在inner_function中分配的,所以它与function中定义的c变量不同。变量ab起作用,因为它们只在inner_function处读取,所以不需要重新定义。将cd重命名为new_cnew_d使其工作。

https://pyfiddle.io/fiddle/184e1778-adb7-4759-8951-da699751c31e/

有关python嵌套函数变量范围的详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def function():
    def inner_function():
        if a[0] > b[0]:
            print("a[0] = {0}, b[0] = {1}".format(a[0], b[0]))
            tmp = c
            new_c = d
            new_d = tmp

    a = [4, 3]
    b = [2, 1]
    c = 1
    d = 2

    inner_function()

function()

虽然您的问题已经得到了解答,但我不确定您的代码为什么会产生这个错误。

不管怎样,尽管你的口译员不同意,但要澄清引起问题的那条线是c = d。让我解释一下。你在inner_function()内,没有这些线(c = dd = tmp时,你指的是在inner_function()外分配的变量abcd。所以,你含蓄地把这些变量(abcd称为global。为内部函数中的变量赋值时,解释器会将其视为该函数的局部变量。在这种情况下,c现在被认为是本地的(因为在inner_function()内有一个任务,即使在声明之后,口译员也会抱怨tmp = c。所以,通常,解释器会抱怨一个变量,它没有被赋值,但无论如何都会被访问。

为了说明清楚,Python没有区分变量的类型(例如Java)。

What is a proper way to pass variables from"function" to
"inner_function"?

使用参数是正确的方法。

Is there any other way than by parameter?

正如其他人提到的,您可以使用全局变量,但不建议将其作为方法。

Why there is an error on"c" variable reference and not on"a" table?

正如我前面提到的,不同类型的变量之间没有区别。使它们不同的是,您在变量c中分配了一个值,但只访问a的值,例如在另一种情况下。

这个具体的答案(也由@raul.vila提到)提供了一个很好的解释。

最后,因为还不清楚你想在这里实现什么。如果尝试在内部函数中打印全局(甚至隐式)变量,或者尝试在内部函数中更改全局变量的值,则存在差异。


我猜Python的方式绝对是指鸭子和兔子,甚至可能是骑士。我还希望第二个@metareven将它们作为参数传入,因为Python处理它们的方式非常简洁。这样就不必担心@global变量。你很清楚什么进去了,什么出来了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def function(duck):
    def inner_function(rabbit):
        if rabbit[0][0] > rabbit[1][0]:
            print("a[0] aka the first one behind the rabbit = {0},
b[0] aka the second one behind the rabbit = {1}"
.format(rabbit[0], rabbit[1]))
            tmp = rabbit[2]
            rabbit[2] = rabbit[3]
            rabbit[3] = tmp
    inner_function(duck)

#Let's sort out the arguments
a = [4, 3]
b = [2, 1]
c = 1
d = 2


function([a,b,c,d])

函数调用返回以下内容:

1
2
3
python innner.py
a[0] aka the first one behind the rabbit = [4, 3],
b[0] aka the second one behind the rabbit = [2, 1]

这个回答了你的问题吗?


您需要将C和D变量声明为全局变量(顺便说一下,这不是一个好主意)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def function():
global c,d
a = [4, 3]
b = [2, 1]
c = 1
d = 2
def inner_function():
    if a[0] > b[0]:
        global c,d
        print("a[0] = {0}, b[0] = {1}".format(a[0], b[0]))
        tmp = c
        c = d
        d = tmp
inner_function()