Python:如果没有的话,请尝试理解处理输出的区别

Python:如果没有的话,请尝试理解处理输出的区别,python,python-3.x,Python,Python 3.x,检查是否有任何参数存储为true,如果没有,则将它们全部设置为true以运行所有参数。ie可以运行一个arg,如果您不选择一个,它将运行所有arg if not any((args.x, args.y, args.z)): args.x = args.y = args.z = True '''this works''' args.x, args.y, args.z = True '''but this does not work - gives TypeError: canno

检查是否有任何参数存储为true,如果没有,则将它们全部设置为true以运行所有参数。ie可以运行一个arg,如果您不选择一个,它将运行所有arg

if not any((args.x, args.y, args.z)):
    args.x = args.y = args.z = True '''this works'''

    args.x, args.y, args.z = True '''but this does not work - gives TypeError: cannot unpack non-iterable bool object'''
但如果我做出这样一个更加丑陋的if声明,它会起作用的

 if args.x is False and args.y is False and args.z is False:
    args.x = args.y = args.z = True '''this works'''
    args.x, args.y, args.z = True '''and this works as well''' 

如果在赋值的左侧有3个变量,那么在右侧也需要有3个变量。这:

args.x, args.y, args.z = True
左侧有3个值,右侧只有1个值。尝试这样做:

args.x, args.y, args.z = True, True, True
或者这个:

args.x, args.y, args.z = [True for i in range(3)]
本声明:

args.x = args.y = args.z = True
工作原理与此相同:

args.x = True
args.y = True
args.z = True

这是合法的python代码。

args.x,args.y,args.z=[True]*3
。第二个赋值应该总是失败的,因为它试图解包一个无法解包的
bool
对象。在
if
块内的第二个示例中添加一个print语句,以便您知道您实际上正在输入它。因为代码应该为您工作的唯一原因是您从未真正将其放入块中。您为什么要在
is
中比较usin?使用
=
如果某项内容不存在,则仅对
使用
。。或者如果你想查看identity@PatrickArtner是的,这可能就是为什么他认为第二个街区在运行而实际上没有。如果不是args.x,也不是args.y,也不是args.z,则与第一个示例更等效的语句是
。您基本上是正确的,但是
args.x=args.y=args.z=True
的工作方式与您描述的不同。如果是这样,并且
x
y
是奇怪的
property
东西,它们不一定返回它们设置的值,那么您将有不可预测的行为。订货也错了,;Python从左到右赋值,即使在这里也是如此。实际行为更像
\uuu unnamed=True
args.x=\uu unnamed
args.y=\uu unnamed
args.z=\uu unnamed
\uu unnamed
实际上是推到帧堆栈上的一个值,复制以填充所有赋值目标)。您可能正在考虑
C
赋值语义。