关于python函数没有定义居然可以顺利执行的问题
代码如下:class Count:
def __init__(self,count=0):
self.count=count
def main():
c = Count()
n=1
m(c,n)
print("count is", c.count)
print("n is",n)
def m(c,n):
c=Count(5)
n=3
main()
输出结果是:
count is 0
n is 1
那么问题来了,在main函数中,m(c,n),m明明是没有定义的,在下一行代码中才定义了m,但是引用main的时候,居然没有报错,怎么会这样QAQ
求解答感谢大佬们 python定义函数不受前后文限制 suchocolate 发表于 2022-10-23 20:03
python定义函数不受前后文限制
原来如此!!!感谢 suchocolate 发表于 2022-10-23 20:03
python定义函数不受前后文限制
诶等一下,如果不受前后文限制,那么m居然没有改变c和n的值吗? 本帖最后由 Brick_Porter 于 2022-10-23 20:21 编辑
你的疑问值得深入思考哦。
python的解释器在执行你编写的代码时会从上往下逐行执行代码,表面上看函数m的定于语句确实出现在了main函数之后,但是真正调用main函数的语句出现在了m函数的定义之后,换言之当解释器执行main()这行代码的时候,它已经把函数m的定义读入内存了,解释器知道main函数内部的m是什么,所以此时不会报错。
来看看例子,第一个示例:
def main():
m()# 调用函数m
def m():
print('hi')
main()# 调用main函数,此时不出错
第二个示例:def main():
m()# 调用函数m
main()# 立即调用函数main,必然报错
def m():
print('hi')
总结来说,如果解释器在执行代码的时候已经了解了函数、类、变量等的定义,那么即使前后文顺序是乱的也没关系,反之则必然报错。
当然,程序的执行方式不止解释执行这一种,另一种执行方式就是类似C语言那种先编译,然后执行编译后的文件。此时上下文乱序就真的没关系了,因为编译器不是逐行执行代码,而是一次性读取全部代码,分析它们的逻辑关系,然后才编译成可执行文件。由于编译器替你分析了前后文关系,所以即使乱序也没关系。只是执行Python代码多用解释器,极少用编译器罢了。 本帖最后由 suchocolate 于 2022-10-23 20:23 编辑
星夕ING 发表于 2022-10-23 20:06
诶等一下,如果不受前后文限制,那么m居然没有改变c和n的值吗?
我觉得你需要补一下下面的知识:https://www.runoob.com/python3/python3-function.html
1)可变传参和不可变传参。
2)全局变量和函数变量的区别。
代码的问题
1)你的m函数操作的是函数变量,不是全局变量,操作后也没有返回值,main函数也没有接收,所以main里的变量就没改变。
2)main里的c是C的实例对象,算是可变传参,传给m后,理论上m去设置如下就又效果的。
c.count = 3
但你的m又创建了一个新的实例,此实例是m的私有实例,虽然和main里的同名,但不是一个对象,且也没有返回给main,所以main里的c还是没有变。
你可以在代码里加入id函数,打印对象的id就知道了,main里的和m里的c不是一个对象:
class Count:
def __init__(self, count=0):
self.count = count
def main():
c = Count()
print(id(c))
n = 1
m(c, n)
print("count is", c.count)
print("n is", n)
def m(c, n):
c = Count(5)
print(id(c))
n = 3
main()
suchocolate 发表于 2022-10-23 20:22
我觉得你需要补一下下面的知识:https://www.runoob.com/python3/python3-function.html
1)可变传参 ...
收到收到!!谢谢大佬!那么您提到“且没有返回给main”,如果我想返回的话,我尝试了一下return(c),但是输出结果却没有改变QAQ,所以返回并不是这样返回吗 Brick_Porter 发表于 2022-10-23 20:18
你的疑问值得深入思考哦。
python的解释器在执行你编写的代码时会从上往下逐行执行代码,表面上看函数m ...
明白力!谢谢大佬!! 星夕ING 发表于 2022-10-23 20:39
收到收到!!谢谢大佬!那么您提到“且没有返回给main”,如果我想返回的话,我尝试了一下return(c), ...
修改后的代码发出来 suchocolate 发表于 2022-10-24 09:12
修改后的代码发出来
class Count:
def __init__(self, count=0):
self.count = count
def main():
c = Count()
n = 1
m(c, n)
print("count is", c.count)
print("n is", n)
def m(c, n):
c = Count(5)
n = 3
return c
main()
是这个样子的!好像确实有点扯这样写(我不太会用return,return是不能这样用吗) 星夕ING 发表于 2022-10-24 21:40
class Count:
def __init__(self, count=0):
self.count = count
我觉得你还是复习一下函数的基础和类的基础。 suchocolate 发表于 2022-10-25 00:39
我觉得你还是复习一下函数的基础和类的基础。
好滴好滴!!!
页:
[1]