我有一个内部功能的功能。我想知道将变量传递给内部函数的正确方法是什么。从我可以看到默认情况下传递的表,虽然我不确定这是一个未记录的变通方法或python设计。
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回溯(最近一次呼叫最后一次):
文件“test.py”,第16行,
function()
File "test.py", line 14, in function
inner_function()
File "test.py", line 5, in inner_function
tmp = c
UnboundLocalError:在赋值之前引用的局部变量'c'
将变量从“function”传递到“inner_function”的正确方法是什么?除了参数之外还有其他方法吗?为什么“c”变量引用出错而不是“a”表?
答案 0 :(得分:1)
AFAIK c
因为在inner_function
内分配而导致错误,因此它与c
中定义的function
变量不同。变量a
和b
有效,因为它们仅在inner_function
处读取,因此它们未被重新定义。将c
和d
重命名为new_c
和new_d
会使其有效。
https://pyfiddle.io/fiddle/184e1778-adb7-4759-8951-da699751c31e/
有关Python nested functions variable scoping
的更多信息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()
答案 1 :(得分:0)
你需要将c和d变量说成全局(顺便说一下这不是一个好主意)
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()
答案 2 :(得分:0)
我猜Pythonic的方式肯定是指鸭子和兔子,甚至可能是骑士。我也将@Metareven作为参数传递给他们,因为Python有一种非常简洁的方式来处理它们。这样您就不必担心@global变量了。而且你对所发生的事情以及所提出的事情有了一个很好的了解。
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}, \nb[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])
函数调用返回以下内容:
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]
这是否回答了你的问题?
答案 3 :(得分:0)
虽然您的问题已得到解答,但我不确定您的代码为何会产生此错误。
无论如何要明确导致问题的一行是c = d
,尽管你的翻译不同意。
让我解释一下。您位于inner_function()
内,没有这些行(c = d
和d = tmp
),您指的是变量a
,b
,c
和{{ 1}}在d
之外分配。因此,您隐含地将这些变量(inner_function()
,a
,b
和c
)称为d
。
在为内部函数内部的变量赋值时,解释器会将其视为此函数的局部变量。在这种情况下,global
现在被认为是本地的(因为即使在解释器抱怨c
的语句之后,inner_function()
内也有一个赋值。所以,通常情况下,解释器会抱怨一个变量,它没有赋值,但无论如何都会被访问。
所以为了说清楚, python不区分变量类型(例如java)。
将变量从“function”传递到的正确方法是什么? “inner_function”?
使用参数是正确的方法。
除参数外还有其他方法吗?
正如其他人所提到的,你可以使用全局变量,但不推荐它作为方法。
为什么“c”变量引用出错而不是“a”表?
正如我之前提到的,不同类型的变量之间没有区别。使它们与众不同的是,您在变量tmp = c
中分配了一个值,但只是访问了c
的值,例如在另一种情况下。
这个specific answer(@ raul.vila也提到过)提供了一个很好的解释。
最后,因为目前还不清楚你想要实现的目标。如果您尝试在内部函数中打印全局(甚至隐式)变量,或者您尝试在内部函数内部更改全局变量的值,则会有所不同。