lzb1001 发表于 2023-5-20 16:40:37

为何返回的结果不一样?

def func_star(a, *args):
        print(a)
        print(*args)

       
>>> func_star(1)
1



def func_star(a, *args):
        print(a)
        dict2 = args
        print(dict2)
       

       
>>> func_star(1)
1
()

isdkz 发表于 2023-5-20 16:41:00

在第一个函数中, *args 是用来接收任意数量的位置参数,它会将这些参数打包成一个元组。当我们调用 func_star(1) 时,只有一个位置参数 1 被传递给了函数,因此 *args 接收到的是一个空元组,即 () , 因此第一个函数的输出结果为 1 和一个空行。

而在第二个函数中, args 是一个元组,我们将它赋值给了 dict2 。当我们调用 func_star(1) 时,只有一个位置参数 1 被传递给了函数,因此 args 接收到的是一个空元组,即 () , 然后将这个空元组赋值给了 dict2 ,因此第二个函数的输出结果为 1 和一个空元组 () 。

陶远航 发表于 2023-5-20 16:41:28

这是因为在第一个示例中,虽然函数定义了可变长度参数 *args,但实际上没有传入任何参数来填充它。因此,在函数体内部,*args 是一个空元组 ()。
而在第二个示例中,虽然只传递了一个参数 1 给函数,但它实际上被赋值给了参数 a。然后 args 参数接收了一个空元组 (),但它被赋值给了一个新的字典变量 dict2,因此在函数中打印出来的 args 实际上是一个空字典 {}。

sfqxx 发表于 2023-5-20 16:46:35

第一个函数 func_star 只有一个参数 a,因此当你调用 func_star(1) 时,只有一个参数被传递给了该函数,对应于变量 a 的值为 1。由于没有其他参数,因此 *args 为空元组 (),因此在第一个函数中 print(*args) 输出为空。

第二个函数 func_star 中也只有一个必选参数 a,但它还定义了一个可变参数 *args,它会捕获所有其他未匹配的位置参数并将它们打包成一个元组。在你调用 func_star(1) 时,只有一个参数被传递给了该函数,对应于变量 a 的值为 1。由于没有其他位置参数,因此 *args 为空元组 ()。但是在函数中,你在第二行使用了元组 args 获取可变参数,而不是使用 *args 将其展开。因此 args 中实际上只有一个值,就是空字典 {}。因此在第二个函数中,print(dict2) 输出的是空字典 {}。

歌者文明清理员 发表于 2023-5-20 16:56:21

这是因为在第一个示例中,函数func_star()仅有一个参数a,没有传入额外的可变参数,因此*args会被视为空元组,所以在第一个示例中,打印出来的*args为空。
而在第二个示例中,定义的可变参数*args并未被使用,而是定义了一个名为dict2的局部变量,并将args赋值给了它,因此,在第二个示例中,打印出来的args的结果是一个空元组。(注意:应该使用args而不是dict2)

lzb1001 发表于 2023-5-20 19:35:58

本帖最后由 lzb1001 于 2023-5-20 19:42 编辑

歌者文明清理员 发表于 2023-5-20 16:56
这是因为在第一个示例中,函数func_star()仅有一个参数a,没有传入额外的可变参数,因此*args会被视为空元 ...

(注意:应该使用args而不是dict2)

上面这句话是什么意思?

必须:

def func_star(a, *args):
      print(a)
      print(args)


不能这样:

def func_star(a, *args):
      print(a)
        dict2 = args
      print(dict2)

吗?为什么?
页: [1]
查看完整版本: 为何返回的结果不一样?