为了账号安全,请及时绑定邮箱和手机立即绑定

函数调用的输出

函数调用的输出

开心每一天1111 2022-11-29 17:20:37
我目前是 python 的新手,我仍在学习基础知识,但有一件事我无法理解。为什么 Q.1 中的代码给出了输出 3,而 Q.2 给出了输出 [4]?当被问到时,我被告知 Q.1 底部的 f(x) 行没有给出任何变量或框来保存 def 给出的新返回值。这就是为什么 x 的输出仍然是 3 的原因。这对我来说很有意义,但是为什么 Q.2 中的输出会等于 g(x) 的返回值?这段代码中也没有任何变量或框来包含 x 的返回值。Q.1:def f(x):    x += 1    return xx=3f(x)print(x)问题 2:def g(x):    x[0] = x[0] + 1    return xx = [3]g(x)print(x)
查看完整描述

4 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

当参数是“复杂的”时,Python 函数通过引用获取参数(指向真实对象的东西),当它是简单的东西时通过值(项目的副本)获取参数。

Q.1 将 int 作为参数,然后函数创建它的内部副本,因此不会在函数外部修改 x 的值。

Q.2 将一个列表作为一个参数,这被认为是复杂的,在这种情况下,该函数引用了原始列表,并且该引用发生的任何事情也将发生在原始列表上。

您可以在此处找到带图像的按引用传递和按值传递的解释


查看完整回答
反对 回复 2022-11-29
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

定义的函数是 Q1 返回一个 for 值。x 包含 3 并通过调用函数传递给函数f(x)。它会递增并返回到函数调用。但是,函数调用没有存储在变量中,所以它没有保存到内存中。没有对返回值进行任何处理。调用该函数只是在局部范围内(在函数内)编辑变量 x。当你使用print(x)它时,它引用了 x 的全局变量,它仍然包含 3。

在第二季度,列表是可变的。在函数内编辑它们,更改在全局范围内持续存在。因为该列表在全局范围内发生了变化,所以 usingprint(x)使用更新后的全局变量。

我希望这是有道理的。查看文档中变量的范围以获取更多信息。


查看完整回答
反对 回复 2022-11-29
?
慕容3067478

TA贡献1773条经验 获得超3个赞

在 Python 中,列表是可变对象,因此它们在函数调用中使用时通过引用传递。这意味着当 g(x) 将 x 的第一个元素加 1 时,函数退出后,原始列表 x 将包含这些更改。

请注意,使用的特定术语不是“按引用传递”,而是“按名称传递”,它带有几个不同的语义,您可以根据需要了解更多信息。


查看完整回答
反对 回复 2022-11-29
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

Q1


def f(x):

    x += 1

    return x

x=3

f(x)

print(x)

返回 3 而不是 4 的原因是因为您没有反弹变量来引用这个新值。而不是f(x)你可以做x = f(x)。


Q2


def g(var):

    var[0] = var[0] + 1

    return var

x = [3]

g(x)

print(x)

为了在不混淆的情况下回答这个问题,我将函数中使用的局部变量更改为 var,这样您就可以更轻松地了解我想向您解释的内容。


首先,您在列表的第一个位置(元素 0)创建一个整数值为 3 的列表,并让 x 引用该列表。


当您调用 g() 函数并传递列表时,该函数将 var 设置为引用相同的列表(不是不同的列表,而是相同的列表)。然后,您告诉该函数将第一个元素中的整数值增加 1。由于列表在某些方法中是可变的,因此您已经更改了局部变量 var 和全局变量 x 的列表。这意味着您实际上不需要使用函数的任何返回值,因为列表已经就地改变了。


看看这个视频https://youtu.be/_AEJHKGk9ns Ned Batchelder 对此有更多解释。



查看完整回答
反对 回复 2022-11-29
  • 4 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信