为什么这里需要尾随逗号来传递 *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) 但是有了逗号它解包元组,一切正常。