我定义了一个函数,该函数将根据其值打印特定的字符串。但是,我收到一条错误消息,说global name 'must_print' is not defined
。
这是我的代码:
def myfunction(must_print):
must_print = True
if bool(must_print) == True:
print("Done")
elif bool(must_print) == False:
print("Change value")
if __name__ == "__main__":
myfunction(must_print)
您知道为什么我会收到此错误吗?
答案 0 :(得分:1)
定义中名为“ must_print”的参数与函数调用名为“ must_print”的参数完全无关。
以下代码与您的代码等效:
def myfunction(x):
x = True
if bool(x) == True:
print("Done")
elif bool(x) == False:
print("Change value")
if __name__ == "__main__":
myfunction(must_print)
Python执行代码时,它首先定义函数,然后尝试执行myfunction(must_print)
。
但是到那时,还没有定义任何称为“ must_print”的东西。
参数名是您要定义的函数的一种方法,用于引用在调用它时传递的值–对函数而言,调用函数的代码如何拼写该值并不重要,参数名称与调用代码无关。
这意味着您可以孤立地理解函数定义,所以让我们做到这一点。
def myfunction(must_print):
# Replace whatever value must_print had with True
must_print = True
# Convert must_print, which has a boolean value, into a boolean, and compare it to True
if bool(must_print) == True:
print("Done")
# Convert must_print, which has a boolean value, into a boolean, and compare it to False
elif bool(must_print) == False:
print("Change value")
用不同的值代替参数的值使该参数毫无意义–当您进入if
时,无论您传递什么参数,它都将是True
,而myfunction("Vacation")
的作用与myfunction(False)
。
删除该作业:
def myfunction(must_print):
# Convert must_print into a boolean, and compare it to True
if bool(must_print) == True:
print("Done")
# Convert must_print into a boolean, and compare it to False
elif bool(must_print) == False:
print("Change value")
但是bool(must_print)
必须是True
或False
,因此您只需要else
和一个条件:
def myfunction(must_print):
# Convert must_print into a boolean, and compare it to True
if bool(must_print) == True:
print("Done")
else:
print("Change value")
现在,如果表达式e
是布尔值,则e == True
与e
相同。
(True == True
是True
,而False == True
是False
。)
因此,我们可以简化一些内容:
def myfunction(must_print):
# Convert must_print into a boolean
if bool(must_print):
print("Done")
else:
print("Change value")
此外,if
将任何Python值都视为真值。
也就是说,if bool(e)
与if e
相同:
def myfunction(must_print):
if must_print:
print("Done")
else:
print("Change value")
现在剩下的就是调用函数,并为其传递一个合适的参数:
if __name__ == "__main__":
myfunction(True)
答案 1 :(得分:0)
您的代码中有很多需要优化的地方。请看一下这个示例:
def myfunction(must_print):
if must_print:
print("Done")
else:
print("Change value")
if __name__ == "__main__":
myfunction(True)
答案 2 :(得分:0)
您应该重视全局限制。
代码:
must_print = True
def myfunction(must_print):
global must_print
must_print = True
if bool(must_print) == True:
print("Done")
elif bool(must_print) == False:
print("Change value")
if __name__ == "__main__":
myfunction(must_print)
输出:
Done
答案 3 :(得分:0)
您会混淆一些事情,当您开始使用函数时,这很容易做到。
您并不需要全局变量,但是在某些时候,您应该阅读Use of "global" keyword in Python来了解有关全局变量的更多信息。
在您定义函数myfunction
的前6行中,您告诉python有一个名为must_print
的参数。此参数在函数内部,而您设置的参数仅存在于该函数内部。
您可以通过几种不同的方式调用该函数:
m_p = True
myfunction(m_p)
或
myfunction(True)
甚至
myfunction(must_print=True)
它们全都归结为同一件事:告诉python调用函数myfunction
,并将其值True传递给第一个参数(名为must_print
)。然后python调用该函数,生成一个名为must_print
的局部变量。 (顺便说一句,在函数的第一行中,将变量设置为True,从而忽略了给出的任何输入。因此,myfunction(True)
和myfunction(False)
现在将具有相同的结果。)
关键是调用函数时,您传递了其他内容-变量或常量项。 (在第三种情况下,您明确告诉它名为must_print
的参数设置为True。在这种情况下,在=
之后,有一个常数或一个变量。前两个情况下,只需将第一个参数设置为True,最后一个参数通过名称指定参数即可。)在函数myfunction
之外,未定义变量must_print
,因此python希望它位于全局变量中范围。
注意,为了减少混乱,我特意避免这种情况:
must_print = True
myfunction(must_print)
这是完全有效的代码,但令人困惑。在这种情况下,您有一个if子句局部变量,该变量用于设置传递给该函数的参数,然后该变量具有相同名称的函数局部变量。这更加令人困惑,所以我从m_p
变量开始。
关于python作用域的一些不错的读物是Short Description of the Scoping Rules?,尤其是以下两个答案:https://stackoverflow.com/a/34094235/1404311,https://stackoverflow.com/a/292002/1404311
根据评论进行编辑:
def myfunction(must_print=True)
和myfunction(must_print=True)
做两件事完全不同。
关键字def
是您定义函数的地方。在函数定义中,must_print=True
表示您有一个名为must_print的变量,其默认值为True。因此,在函数内部,无论您执行myfunction(True)
还是仅执行myfunction()
,都会有一个名为must_print
的参数,其值为True。仅当您将其显式设置为其他值(例如myfunction(False)
时,must_print
的变量才会为True。
在第二个版本中,您将明确命名该参数。当您只有一个参数时,它并没有真正的意义,因此请尝试以下操作:
def foo(arg1=8, arg2='hello', arg3=True):
print(arg1, arg2, arg3)
然后您可以执行foo()
,它将显示“ 8 hello True”。或者,您可以执行foo(7)
,这将显式设置arg1并使用arg2和arg3的默认值,并输出“ 7 hello True”。或foo(6, 'goodbye')
打印“ 6再见,是”,或foo(5, 'whatever', False)
将打印“ 5,再见”。但是如何使用默认值并仅更改最后一个参数?那就是命名参数的输入。尝试foo(arg3=False)
,输出将为“ 8 hello False”。
最好的学习方法就是做事。在python解释器中尝试使用此类小功能。您将很快掌握它。