Python:arg=(myDict,)和arg=(myDict)之间的差异

Python:arg=(myDict,)和arg=(myDict)之间的差异,python,arguments,tuples,Python,Arguments,Tuples,在我的python代码中,我有一个类。我想在线程中运行类的方法。该方法将字典作为其参数 def func1(self, input_dictionary): ... 为了在线程中运行此方法,我发现需要将字典作为(mydict,)传递给函数: 我想知道arg=(myDict,)和arg=(myDict)之间的区别。mydict之后的,对元组有什么作用 运行以下命令将导致python抱怨self.func1接受2个位置参数,并且我输入了错误数量的输入 threading.Thread(ta

在我的python代码中,我有一个类。我想在线程中运行类的方法。该方法将字典作为其参数

def func1(self, input_dictionary):
    ...
为了在线程中运行此方法,我发现需要将字典作为
(mydict,)
传递给函数:

我想知道
arg=(myDict,)
arg=(myDict)
之间的区别。
mydict
之后的
对元组有什么作用

运行以下命令将导致python抱怨
self.func1
接受2个位置参数,并且我输入了错误数量的输入

threading.Thread(target=self.func1, arg=(mydict)) # or the next one
threading.Thread(target=self.func1, arg=mydict)

有人能解释一下吗?

答案是结尾的“,”使括号定义了一个元组。没有逗号,它只是多余的括号

至于9个参数而不是2个,python在那里做的事情如下:它期望解包一个参数元组,所以它尝试解包它传递的对象


事实证明,my_dict有9个值,因此它们被解包为参数-在函数中提供9个参数。

在Python中,括号创建元组是一种常见的误解

传递
arg=(myDict)
相当于传递
arg=myDict
,类似于数学中
(1)+(1)
相当于
1+1

实际上,正是逗号使Python解析器决定您实际上正在构建一个元组。这意味着,要使用单个元素创建元组,您需要添加一个有点笨拙的尾随逗号。您可以在Python REPL中自己检查此行为:

>>> (1)
1
>>> type((1))
<class 'int'>
>>> (1,)
(1,)
>>> type((1,))
<class 'tuple'>
>(1)
1.
>>>类型((1))
>>> (1,)
(1,)
>>>类型((1,))

因此,在您的例子中,您需要传递
arg=(myDict,)
以确保您的参数作为元组传递。

很好的说明!现在我完全明白了。谢谢。我对开箱这个概念还不太熟悉。今天我学到了一些东西。感谢您在回答中澄清这一点。请查看python中的*运算符:或者这里的任何版本的
arg=
都是错误的-参数名是
args
。这似乎是一个小细节,但你只是被这样一个小细节咬了一口。请在发帖时更加小心。这样的打字错误会掩盖问题的真正原因。绝对正确。对不起。我对我正在讨论的问题感到分心,并且忘记了我文章中的其他细节。删除[multithreading]标记是因为这个问题及其答案与线程无关。这只是一个关于Python语言的问题。
>>> (1)
1
>>> type((1))
<class 'int'>
>>> (1,)
(1,)
>>> type((1,))
<class 'tuple'>