我是python的新手,曾在http://do1.dr-chuck.com/pythonlearn/EN_us/pythonlearn.pdf4.9节用户定义的功能。一路上我很困惑。
当代码round0为:时
bruce=input("please enter what to be printed 2x")
def printTwice(bruce):
print(bruce)
print(bruce)
printTwice("alpha")
不管我给出了什么输入,结果都是";α";。好吧,我明白了;α";被设置为"0"的值;bruce"在这里
圆形1:
bruce=input("please enter what to be printed 2x") #to input "hello"
not1=123
def printTwice(not1): #set parameter to not1 , not1 is set as 123 , but output is what was given in input
print(bruce)
print(bruce)
printTwice("a")
输出结果是为bruce输入的任何内容。例如";你好";
问:为什么它忽略了论点"a";以及";not1";并取得输入";你好";给布鲁斯
第二回合:#由于我看到python没有注意到我要求它做什么,我删除了"的引号;a",成为
bruce=input("please enter what to be printed 2x")
not1=123
def printTwice(not1): #set parameter to not1 , not1 is set as 123 , but output is what was given in input
print(bruce)
print(bruce)
printTwice(a) # argument doesn't have " " now
output:名称错误:未定义名称"a"。问:为什么我这次放在括号里的东西现在很麻烦,而不是第0轮和第1轮
我知道我的问题是初学者,或者可能在某个地方重复,如果是,请给我指右边的帖子。非常感谢。
这里有一些事实:
- 当你为函数定义一个参数时,它就变成了一个"局部变量";该功能
- 局部变量总是在全局变量(模块中定义的变量(的后面。(让我们暂时跳过全局关键字(
- 有一个LEGB规则,Python在试图查找名称(变量(时会关心它。它们代表本地包围全球建筑。它完全按照这个顺序搜索名称
在round0中,您将bruce
定义为参数,因此它将覆盖全局变量bruce
。这就是为什么函数中的bruce
正是作为局部变量的参数。您可以考虑在函数中创建一个变量bruce = 'alpha'
。它在具有input()
结果的全局命名空间中遮蔽变量bruce
在round1中,您将not1
定义为参数,但从未使用过该变量。相反,您使用了变量bruce
,它不是局部变量,因为它没有在函数内部定义,也没有作为参数定义。现在Python也向前看,看看它是否能在全局命名空间中找到它。。。
round2是另一回事。。。不要混淆作为参数的名称和作为自变量的名称。如果将bruce
这样的名称添加到参数中(如上所述(,则将创建局部变量。就像你在函数中说bruce = 10
一样。但在这里,当您在调用函数时将a
传递给它时,实际上就是将对象传递给该函数。a
之前必须存在。在以前的情况下,你不会得到错误,因为你将对象(字符串对象'a'
和'alpha'
(传递给函数。如果你在用printTwice(a)
调用函数之前有类似a = 10
的东西,你也不会得到错误。因为现在a
指向对象10
。
如果你把名称作为参数,Python会为你创建一个局部变量。如果你把一些东西传递给参数,Python就会首先对它求值(这就是为什么你之前必须有它们(,并把实际的(对该对象的引用(对象发送给函数的参数。