为什么python返回值处写两个变量a,b=fun()和一个变量a=fun()的结果类型不同?

import numpy as np
import scipy.stats as ss
np.random.seed(1000)
sample=ss.norm(1,1).rvs(100000)
print(ss.kurtosistest(sample),type(ss.kurtosistest(sample)))
print("-------------------")
a,b=ss.kurtosistest(sample)
print(a,type(a),"||",b,type(b))

image.png

为什么ss.kurtosistest(sample)得到的对象类型是 <class 'scipy.stats.stats.KurtosistestResult'>
a,b=ss.kurtosistest(sample),得到的a和b就是float了呢?

阅读 3.7k
2 个回答

python的赋值过程如下:

  1. 若赋值左边是一个正常的变量,则右边的表达式求值之后直接赋值给左边的表达式
  2. 若赋值左边含有 , 则赋值右边必须是一个iterable的值,此时把迭代器生成的值一一对应的赋值给对应的变量
  3. ... 其他 ... 略
class TestAssignment():
    def __iter__(self):
        # 原谅我直接使用 Tuple 的 __iter__ 生成迭代器
        return (1, 2).__iter__()

    def __str__(self):
        return "TestAssignment"


obj = TestAssignment()
a = obj
print(a)        # TestAssignment
a, b = obj
print(a, b)     # 1 2

所以python里可以这样赋值a, b = 1, 2,不是因为规定了Tuple可以这样赋值,而是因为 Tuple是可迭代的

你这么看就容易理解了:a,b = rs = ss.kurtosistest(sample)

这涉及到Python的概念(拆包):
1、所谓拆包:对于函数中的多个返回数据, 去掉元组, 列表 或者字典,直接获取里面数据的过程。
2、即:函数有多个返回值时(或者是例如list,tuple等等),Python能自动进行拆包.
例如:

def test(x):
    y1 = x + 1
    y2 = x + 2
    return y1, y2


result = test(2)
a, b = test(2)

print("这是返回实际结果:" + str(type(result)))
print("这是拆包后的a值:" + str(type(a)))
print("这么比较容易理解:a, b= result = test(2)")

结果:

这是返回实际结果:<class 'tuple'>
这是拆包后的a值:<class 'int'>
这么比较容易理解:a, b= result = test(2)
推荐问题
宣传栏