鱼C论坛

 找回密码
 立即注册
查看: 3233|回复: 11

[已解决]关于python函数没有定义居然可以顺利执行的问题

[复制链接]
发表于 2022-10-23 19:59:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:
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
求解答感谢大佬们
最佳答案
2022-10-23 20:03:43
python定义函数不受前后文限制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-23 20:03:43 | 显示全部楼层    本楼为最佳答案   
python定义函数不受前后文限制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-23 20:04:07 | 显示全部楼层
suchocolate 发表于 2022-10-23 20:03
python定义函数不受前后文限制

原来如此!!!感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-23 20:06:29 | 显示全部楼层
suchocolate 发表于 2022-10-23 20:03
python定义函数不受前后文限制

诶等一下,如果不受前后文限制,那么m居然没有改变c和n的值吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-23 20:18:35 | 显示全部楼层
本帖最后由 Brick_Porter 于 2022-10-23 20:21 编辑

你的疑问值得深入思考哦。

python的解释器在执行你编写的代码时会从上往下逐行执行代码,表面上看函数m的定于语句确实出现在了main函数之后,但是真正调用main函数的语句出现在了m函数的定义之后,换言之当解释器执行main()这行代码的时候,它已经把函数m的定义读入内存了,解释器知道main函数内部的m是什么,所以此时不会报错。

来看看例子,第一个示例:
  1. def main():
  2.     m()  # 调用函数m

  3. def m():
  4.     print('hi')

  5. main()  # 调用main函数,此时不出错
复制代码


第二个示例:
  1. def main():
  2.     m()  # 调用函数m

  3. main()  # 立即调用函数main,必然报错

  4. def m():
  5.     print('hi')
复制代码


总结来说,如果解释器在执行代码的时候已经了解了函数、类、变量等的定义,那么即使前后文顺序是乱的也没关系,反之则必然报错。

当然,程序的执行方式不止解释执行这一种,另一种执行方式就是类似C语言那种先编译,然后执行编译后的文件。此时上下文乱序就真的没关系了,因为编译器不是逐行执行代码,而是一次性读取全部代码,分析它们的逻辑关系,然后才编译成可执行文件。由于编译器替你分析了前后文关系,所以即使乱序也没关系。只是执行Python代码多用解释器,极少用编译器罢了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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不是一个对象:
  1. class Count:
  2.     def __init__(self, count=0):
  3.         self.count = count


  4. def main():
  5.     c = Count()
  6.     print(id(c))
  7.     n = 1
  8.     m(c, n)
  9.     print("count is", c.count)
  10.     print("n is", n)


  11. def m(c, n):
  12.     c = Count(5)
  13.     print(id(c))
  14.     n = 3


  15. main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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,所以返回并不是这样返回吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-23 20:40:22 | 显示全部楼层
Brick_Porter 发表于 2022-10-23 20:18
你的疑问值得深入思考哦。

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

明白力!谢谢大佬!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

修改后的代码发出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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是不能这样用吗)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-25 00:39:41 | 显示全部楼层
星夕ING 发表于 2022-10-24 21:40
class Count:
    def __init__(self, count=0):
        self.count = count

我觉得你还是复习一下函数的基础和类的基础。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-26 20:15:51 | 显示全部楼层
suchocolate 发表于 2022-10-25 00:39
我觉得你还是复习一下函数的基础和类的基础。

好滴好滴!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 07:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表