星夕ING 发表于 2022-10-23 19:59:57

关于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
求解答感谢大佬们

suchocolate 发表于 2022-10-23 20:03:43

python定义函数不受前后文限制

星夕ING 发表于 2022-10-23 20:04:07

suchocolate 发表于 2022-10-23 20:03
python定义函数不受前后文限制

原来如此!!!感谢

星夕ING 发表于 2022-10-23 20:06:29

suchocolate 发表于 2022-10-23 20:03
python定义函数不受前后文限制

诶等一下,如果不受前后文限制,那么m居然没有改变c和n的值吗?

Brick_Porter 发表于 2022-10-23 20:18:35

本帖最后由 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:22:25

本帖最后由 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()

星夕ING 发表于 2022-10-23 20:39:51

suchocolate 发表于 2022-10-23 20:22
我觉得你需要补一下下面的知识:https://www.runoob.com/python3/python3-function.html
1)可变传参 ...

收到收到!!谢谢大佬!那么您提到“且没有返回给main”,如果我想返回的话,我尝试了一下return(c),但是输出结果却没有改变QAQ,所以返回并不是这样返回吗

星夕ING 发表于 2022-10-23 20:40:22

Brick_Porter 发表于 2022-10-23 20:18
你的疑问值得深入思考哦。

python的解释器在执行你编写的代码时会从上往下逐行执行代码,表面上看函数m ...

明白力!谢谢大佬!!

suchocolate 发表于 2022-10-24 09:12:44

星夕ING 发表于 2022-10-23 20:39
收到收到!!谢谢大佬!那么您提到“且没有返回给main”,如果我想返回的话,我尝试了一下return(c), ...

修改后的代码发出来

星夕ING 发表于 2022-10-24 21:40:28

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是不能这样用吗)

suchocolate 发表于 2022-10-25 00:39:41

星夕ING 发表于 2022-10-24 21:40
class Count:
    def __init__(self, count=0):
      self.count = count


我觉得你还是复习一下函数的基础和类的基础。

星夕ING 发表于 2022-10-26 20:15:51

suchocolate 发表于 2022-10-25 00:39
我觉得你还是复习一下函数的基础和类的基础。

好滴好滴!!!
页: [1]
查看完整版本: 关于python函数没有定义居然可以顺利执行的问题