首页 新闻 会员 周边 捐助

python的*星号表达式

0
悬赏园豆:80 [已解决问题] 解决于 2022-09-07 17:51

错误写法:

*a=range(0,5,2)#错误提示SyntaxError: starred assignment target must be in a list or tuple

正确写法:

a,=range(0,5,2)
[
a]=range(0,5,2)

a后面加个逗号是将a声明为省略括号的元组类型吗?为什么要这样写,不能直接使用a,第二种写法是将a写在一个空列表里也不会报错,这个除了在函数里面作用于作为形参,实参时,其他场景下使用只能使用元组和列表对象进行接收吗?求大佬解答

如果使用**对字典类型的对象进行解包呢?该怎样写

Ttonet的主页 Ttonet | 初学一级 | 园豆:5
提问于:2022-09-07 13:52
< >
分享
最佳答案
1

我针对官网的发现做了尝试

##  __file__:demo.py

# *a, = range(5)
# [*a] = range(5)
(*a,) = range(5)
print(a)

分别用 dis 模块查看这三行代码的字节码,可以看到输出是一样的

>python -m dis demo.py
  9           0 LOAD_NAME                0 (range)
              2 LOAD_CONST               0 (5)
              4 CALL_FUNCTION            1
              6 UNPACK_EX                0
              8 STORE_NAME               1 (a)

 10          10 LOAD_NAME                2 (print)
             12 LOAD_NAME                1 (a)
             14 CALL_FUNCTION            1
             16 POP_TOP
             18 LOAD_CONST               1 (None)
             20 RETURN_VALUE

python 里面当元组只有一个参数时,写法是 (param,),那么 SyntaxError: starred assignment target must be in a list or tuple 就说的通了,至于 *a,(*a,)有啥关系,你自己挖掘下吧

收获园豆:80
〆灬丶 | 老鸟四级 |园豆:2314 | 2022-09-07 16:19

谢谢大佬!a,和[a]明白了a,就是省略括号的元组类型的简写,python规定死的在星号表达式中必须使用列表类对象和元组类对象,但是还有点问题,【如果作用在函数里的对象返回的是元祖类型的值,这里返回的类型却是列表】;【还有对字典进行解包时,作用在函数里时是用**,组包对象是以字典形式返回的;使用星号表达式对字典类型的对象进行组包的话只能用,如果使用两个会报无效语法(SyntaxError: invalid syntax),而且默认只返回字典的key以列表的形式返回,或者在解包时指定字典里的items方法是才会返回对应的key:value值,而且是以列表嵌套元组的方式返回的,星号表达式没有使用的方法还是用法不一样】
b={'a':1,'b':2}
*c,=b.items()

返回结果:

('a', 1), ('b', 2)]

Ttonet | 园豆:5 (初学一级) | 2022-09-07 17:47

@Ttonet: 返回值为啥是列表,你去搜Python字节码就知道了

〆灬丶 | 园豆:2314 (老鸟四级) | 2022-09-08 09:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册