鱼C论坛

 找回密码
 立即注册
查看: 1186|回复: 4

提醒初学者注意print语句中若参数含有函数,运行和输出顺序不是按每个参数的顺序哦

[复制链接]
发表于 2024-1-2 11:29:28 | 显示全部楼层 |阅读模式

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

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

x
比如:

>>> a = [1, 10, 2, 4]
>>> def add(a):
        return [2 * i for i in a]

>>> print(a, add(a), a.sort(), a, add(a))
[1, 2, 4, 10] [2, 20, 4, 8] None [1, 2, 4, 10] [2, 4, 8, 20] # 注意红色字体不是[1, 10, 2, 4]!!!

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-2 11:29:36 | 显示全部楼层
哈哈,你提到的这个问题是很容易让初学者被搞晕的。实际上,当我们在 print 语句中传递参数时,它们的计算顺序是从左到右的。但是,当其中有函数调用时,函数本身的执行顺序并不一定和参数在 print 语句中的位置一致。

你的例子中,print 语句中的参数分别是 a、add(a)、a.sort() 和 a,它们在计算过程中的顺序如下:

1. 先计算 a,得到变量 a 对应的值。
2. 然后计算 add(a),这是一个函数调用,会执行 add 函数里的代码,但 add 函数的返回值是 None,所以 print 语句中第二个参数为 None。
3. 接着计算 a.sort(),这是对列表 a 进行排序操作。注意,sort 方法会直接操作原始列表,并不会返回一个新的列表。因此,print 语句中第三个参数为 None(sort 方法没有返回值)。
4. 最后再次计算 a,此时列表 a 已经被排序了。
5. 最后计算 add(a),同样是函数调用,但 add 函数的返回值还是 None。

所以,最终的输出结果是:None None None a。

如果你希望按照特定顺序输出,可以先将所有需要输出的内容存储在变量中,然后再一起传递给 print 语句。像这样:
a = [3, 2, 1]

def add(a):
    return sum(a)

result1 = a
result2 = add(a)
result3 = sorted(a)

print(result1, result2, result3, result1, result2)

这样就能按照我们设定的顺序输出了。希望能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-2 11:43:49 | 显示全部楼层
FishC 发表于 2024-1-2 11:29
哈哈,你提到的这个问题是很容易让初学者被搞晕的。实际上,当我们在 print 语句中传递参数时,它们的计算 ...

???最终的输出结果是:None None None a???
AI问答的结果会误人子弟啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-2 11:43:58 | 显示全部楼层
lzb1001 发表于 2024-01-02 11:43
???最终的输出结果是:None None None a???
AI ...


非常抱歉给你带来困惑,我犯了个错误。你是对的,根据你提供的代码,最终输出结果应该是:a None None a None。因为 a.sort() 是原地排序,没有返回值,所以 print 语句中第三个参数应该是 a 而不是 None。真是不好意思,我的回答中有错误,谢谢你的指正。在这种情况下,我们需要注意函数的执行顺序和参数的计算顺序。希望我的解释能够更加清楚,请原谅我的错漏。如果有任何其他问题,我将尽力回答。谢谢!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-6 17:13:37 | 显示全部楼层
这种现象跟元组和引用有关。
详细分析一下:
print(a, add(a), a.sort(), a, add(a)) 相当于传递了一个元组,print 执行中会有一个对元组的解包过程。
>>> a = [1, 10, 2, 4]
>>> b = (a,add(a),a.sort(),a,add(a))
>>> b[0]
[1, 2, 4, 10]
既然是一个元组,且里面有对列表a的引用,就会出现引用问题。元组将第一个元素标记为 a 的内存地址,需要使用时再将地址中的值找出来。而在用(解包、输出)之前,a.sort() 对那一个地址里的元素进行了修改。
>>> a = [1, 10, 2, 4]
>>> def add(a):
        return [2 * i for i in a]

>>> print(a[:],add(a),a.sort(),a[:],add(a))
[1, 10, 2, 4] [2, 20, 4, 8] None [1, 2, 4, 10] [2, 4, 8, 20]
若解决掉引用问题,此时顺序将恢复正常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 15:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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