设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 1929|回复: 3
打印 上一主题 下一主题

求助

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

楼主
发表于 2023-7-22 01:31:30 |显示全部楼层
好问题!

这里函数中的变量i是在外部作用域中定义的,对函数而言不是局部变量,所以这里的 i 在实现上传递的是一个地址,他们都是同一个x

你可以在f函数中加个print(id(i)),就会发现值是一样的,因为它们是同一个i
而且你可以在for循环里函数外加上print,会发现函数内的print直到最终调用 f1 的时候才会执行,而并非在循环定义的时候。

参考:https://blog.csdn.net/wmx1117/article/details/106437950
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2024-2-10 01:17:53 |显示全部楼层
哈尔滨小电工 发表于 2024-2-9 09:50
时间戳:2024.2.9
要得到1,4,9只要做一步小小的变动就搞定了,把代码中的fs.append(f)改成fs.append(f()) ...

你没发现你这么改了之后就不能调用 f1() f2() f3() 了吗

函数加不加括号是两码事,不存在是函数就要加上()这种说法,加不加括号取决你需要的是一个函数对象,还是函数的调用结果(也就是函数的返回值)
你虽然把代码改得不报错了,但并不是原题要问的原因。原因如我上面的回答,在定义时函数不会执行
你加了括号,自然函数被执行了,得到了返回结果,但你这个元素的类型也完全不一样了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2024-2-11 23:55:47 |显示全部楼层
哈尔滨小电工 发表于 2024-2-11 06:53
是这样,元素类型不一样了,我jio得提问者如果也是小白,可能和我一样在初学的时候没有理解“调用函数” ...

提问者不是小白,或者说他问的不是一个小白问题,是你没理解他问的点在哪里。所以你才会给了一个直接绕开了问题的改法

他想问的点在于,为什么函数里的i不是定义时的值,而全部变成了最终值。
并不是说要得到1,4,9应该怎么写。

并且即使不用到列表,一样可以重现这个情况:
  1. for i in range(1, 4):
  2.     def f():
  3.          return i*i
  4.     if i == 1:
  5.         a = f
  6.     elif i == 2:
  7.         b = f
  8.     elif i == 3:
  9.         c = f
  10. print(a(),b(),c())
复制代码
要就这个问题把结果改成1、4、9的话,更有针对性改法是把其中的f改为
  1. def f(x=i):
  2.              return x*x
复制代码
完全这个代码需涉及到函数定义的执行顺序、局部变量、变量的引用、以及一个叫做“闭包”的概念。





#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2024-2-11 23:59:47 |显示全部楼层
crossin先生 发表于 2023-7-22 01:31
好问题!

这里函数中的变量i是在外部作用域中定义的,对函数而言不是局部变量,所以这里的 i 在实现上传递 ...

你可以先尝试理解我在一开始给他的这个回答。

如果还不能理解,说明目前对你来说超纲了。先把基础学完再来。或者你愿意现在啃也行,公众号里回复 局部变量,把几篇文章都看懂

如果仅仅是因为函数加没加括号的区别,我不会专门说这是一个“好问题!”
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-19 01:49 , Processed in 0.018774 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部