当前位置:Gxlcms > Python > 元组的reference前加个星号是什么意思?

元组的reference前加个星号是什么意思?

时间:2021-07-01 10:21:17 帮助过:62人阅读

rect = (0, 0, screen.width(), screen.height())  
pixbuf = Gdk.pixbuf_get_from_window(rootwin, *rect)#其中*rect是什么?

回复内容:

我不会用PyGObject, 纯讨论星号参数这个语法.

类似问题(也许对你有帮助):
定义函数def func(**kwargs):print kwargs调用函数的时候 一定要func(a=1,b=2,c=3)这样吗?dict_t={'a':1,'b':2,'c':3}不能直接传字典吗?例如func(dict_t)。有什么好方法吗?

Python 参数知识(变量前加星号的意义)



咱们先搞定星号参数的含义以及2个例子:

在参数名之前使用1个星号,就是让函数接受任意多的位置参数。
2个星号就是接受任意多的关键字参数。


位置参数的举例:
假设你有这么个需求:把某函数接收到的除了第一个参数之外的所有参数输出。



关键字参数的举例:
不管你传入多少个关键字参数, 我都能在kw里找到.




接着来搞定这个类似于你在问题中的补充资料中的例子:


下面这个例子接受任意多的位置参数, 只输出第一个
(这里的 s 的类型是元组)


咱们定义一个新元组,待会扔给mean函数。


2种用法的区别:

可以看出,用了星号之后,就把元组 a 给解包(unpack)了。拆成一个个参数扔进去了。
上面这个例子等价于:




================== 2013-2-26更新 ================


s 是元组, 所以值不可修改。
我这里企图把位置参数里的第1个的值修改成5,然后输出。


使用元组看看:

我们换成列表看看:
用字符串看看:

我们这里拆了列表,元组,字符串变成位置参数再传进去。
可以看到不论如何。s 都是元组。
存储位置参数的这个 s 变量的类型并不取决于传入的参数的类型。




================= 再随便多写一些例子 =================:
普通函数:

文艺函数:





mean 遍历输出所有位置参数。s 是元组,别忘了。
咱们拆一下 列表 和 字符串。
拆元组:


拆字典:


拆字典它只会把[键]传进去,你是取不到值的。



====== 要接受拆字典的值。函数形参用2个星号就行了。=======

这里的意思是: 把所有的关键字参数都扔给s (不包括位置参数)
用函数时,
c前面的2个星号只是代表把 c 拆成关键字参数形式。

用的时候我们把字典拆成了关键字参数。
而函数接收的也是关键字参数。所以这个不会报错。


等价于这么用:(没报错吧哈哈。)



如果你用函数的时候只给了1个星号:

或是不给星号:
都是会报错的。


为什么??

放1个星号:
字典前面放个1个星号的确是拆开的意思。
1个星号拆字典会只是传入[键]。之前的一个例子证明过了。

问题是我们的函数mean它只接受关键字参数(回顾一下我们前面对mean的定义):s 里面啥也没有啊。 输出啥? 报错!


不放星号:
不放星号就代表你把那个字典直接扔进去了。
问题是函数形参**s只接受关键字参数。
s 里面还是啥也没有, 报错!



(所有的举例所使用到的 函数名 参数名 都是随便取的, 没有什么特殊意义.)
感觉自己举例的还不是很好,如果哪里把你弄迷糊了。
欢迎在评论区讨论. :)



扩展阅读环节:

StackOverflow 上解释星号语法的问题:
syntax - Python: Once and for all. What does the Star operator mean in Python?

引用传值的问题:
Python: How do I pass a variable by reference? 表示把这个参数展开传进去。等价于:
pixbuf = Gdk.pixbuf_get_from_window(rootwin, 0, 0, screen.width(), screen.height())
调用(caller)
func(*sequence) Pass all objects in sequence as individual positional arguments
seq = [1,2,3]
func(*seq) -> func(1, 2, 3)

func(**dict) Pass all key/value pairs in dict as individual keyword arguments
dict = {'a' = 1, 'b' = 2}
func(*dict) -> func(a = 1, b = 2)

函数定义的
def func(*name) Matches and collects remaining positional arguments in a tuple
func(1, 2, 3) -> name = [1, 2, 3]

def func(**name) Matches and collects remaining keyword arguments in a dictionary
func(a = 1, b= 2) -> dict = {'a' = 1, 'b' = 2}

可参考 Chapter 18. Arguments python里星号有两种意思
1. 定义函数时
一般情况下,函数的参数接受指定个数的参数,比如
def func(a, b, c):
    print a, b, c
推荐一篇post:Understanding '*', '*args', '**' and '**kwargs' >>> def test(*args, **kwargs):
... print args, kwargs

>>>a={"a":1, "b":2}

>>> test(a)
({'a': 1, 'b': 2},) {}
>>> test(*a) #这里等同于test('a', 'b')
('a', 'b') {}
>>> test(**a) #这里等同于test(a=1, b=2)
() {'a': 1, 'b': 2}

一个星号就是把一个序列拆解传入,如果变量本身是字典,会退化成key的序列。
两个星号就是把key-value拆解传入。
姑且就当是语法糖吧。 搬运工:1.2 解压可迭代对象赋值给多个变量
这个解压非常dedicate,具有很多优雅的技巧。
总结如下:
(1)
完全不需要tem中间变量的交换:
a,b =b,a
(2)
有时候,你可能只想解压一部分,丢弃其他的值。对于这种情况Python并没有提供特殊的语法。 但是你可以使用任意变量名去占位,到时候丢掉这些变量就行了。
>>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
>>> _, shares, price, _ = data

人气教程排行