为什么这里需要尾随逗号来传递 *args 参数中的列表?
Why is a trailing comma needed here to pass a list in an *args parameter?
我试图将 Python 3 和 运行 中的 threading
包用于我不理解的关于尾随逗号的情况。
这是代码,没有逗号:
import threading
def thread_func(my_list):
print(my_list)
if __name__ == '__main__':
test_list = [ 1, 2, 3 ]
my_thread = threading.Thread(target=thread_func, args=(test_list)) # WITHOUT comma
my_thread.start()
这给出了这个错误:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
self.run()
File "/usr/lib/python3.7/threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
TypeError: thread_func() takes 1 positional argument but 3 were given
如您所见,Python 试图“解开”列表并将其作为参数传递。
如果我在 args 值中添加一个逗号,它可以正常工作:
import threading
def thread_func(my_list):
print(my_list)
if __name__ == '__main__':
test_list = [ 1, 2, 3 ]
my_thread = threading.Thread(target=thread_func, args=(test_list,)) # WITH comma
my_thread.start()
输出:
[1, 2, 3]
通常,如果我想将列表作为参数传递给此函数,我会使用结构 thread_func(test_list)
和 it would work fine。为什么这里需要尾随逗号?
因为逗号构成了元组,所以俗话说。
(1)
只是对括号进行分组,但是 (1, )
是一个带有一个整数的元组。在这种情况下,线程初始化器正在解包 args,所以没有逗号它是解包测试列表,基本上是 test_func(*test_list)
但是有了逗号它解包元组,一切正常。
我试图将 Python 3 和 运行 中的 threading
包用于我不理解的关于尾随逗号的情况。
这是代码,没有逗号:
import threading
def thread_func(my_list):
print(my_list)
if __name__ == '__main__':
test_list = [ 1, 2, 3 ]
my_thread = threading.Thread(target=thread_func, args=(test_list)) # WITHOUT comma
my_thread.start()
这给出了这个错误:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
self.run()
File "/usr/lib/python3.7/threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
TypeError: thread_func() takes 1 positional argument but 3 were given
如您所见,Python 试图“解开”列表并将其作为参数传递。
如果我在 args 值中添加一个逗号,它可以正常工作:
import threading
def thread_func(my_list):
print(my_list)
if __name__ == '__main__':
test_list = [ 1, 2, 3 ]
my_thread = threading.Thread(target=thread_func, args=(test_list,)) # WITH comma
my_thread.start()
输出:
[1, 2, 3]
通常,如果我想将列表作为参数传递给此函数,我会使用结构 thread_func(test_list)
和 it would work fine。为什么这里需要尾随逗号?
因为逗号构成了元组,所以俗话说。
(1)
只是对括号进行分组,但是 (1, )
是一个带有一个整数的元组。在这种情况下,线程初始化器正在解包 args,所以没有逗号它是解包测试列表,基本上是 test_func(*test_list)
但是有了逗号它解包元组,一切正常。