简单的赋值运算符在Python中变得复杂

简单的赋值运算符在Python中变得复杂,第1张

概述我在 python中声明了四个变量[a = 1,b = 2,c = 3,d = 0],并使用’,’和’='(简单赋值运算符)将它们换成一行代码. 我有多个答案,并感到困惑.请帮我… 情况1: a=1b=2c=3d=0a=a,b=b,cprint "a = " + str(a)print "b = " + str(b)print "c = " + str(c)print "d = " 我在 python中声明了四个变量[a = 1,b = 2,c = 3,d = 0],并使用’,’和’='(简单赋值运算符)将它们换成一行代码.

我有多个答案,并感到困惑.请帮我…

情况1:

a=1b=2c=3d=0a=a,b=b,cprint "a = " + str(a)print "b = " + str(b)print "c = " + str(c)print "d = " + str(d)

案例1的输出:

a = 2b = 3c = 3d = 0

案例2:

a=1b=2c=3d=0b=a,cprint "a = " + str(a)print "b = " + str(b)print "c = " + str(c)print "d = " + str(d)

案例2的输出:

a = 2b = 3c = 3d = 0

案例3:

a=1b=2c=3d=0c=a,cprint "a = " + str(a)print "b = " + str(b)print "c = " + str(c)print "d = " + str(d)

案例3的输出:

a = 2b = 3c = (2,3)d = 0

案例4:

a=1b=2c=3d=0d=a,cprint "a = " + str(a)print "b = " + str(b)print "c = " + str(c)print "d = " + str(d)

案例4的输出:

a = 2b = 3c = 3d = (2,3)

困惑是:

在第3和第4种情况下,输出是正确的(正如我预期的那样).但在数字1和2的情况下,a的值是2,b的值是3.我希望该值应该是(2,3).那我的代码有什么问题?

[我的Python版本是2.7]

解决方法 tl; dr:从左到右,而不是从右到左(在评估右侧表达式之后)评估多个赋值(多行=一行上的语句).

更复杂的是,你在一个令人兴奋的混合中使用元组赋值和“正常”赋值.

元组赋值使用一个赋值运算符,因此要交换两个变量,请使用:

a,b = b,a

右侧必须评估与左侧有变量的元素数相同的元组.你做到了,所以没关系.

现在,在您的示例中,您不仅要解包元组.当左侧仅包含一个变量时,元组未解包,只是简单地分配:

a,b = 1,2a = b,a

变成(2,1).

当您在同一行上使用多个作业时,乐趣就开始了.这些是从左到右处理的.

那么,下面是一个简单的例子:

a = b = c = 1

意味着a变为1,然后是b,然后是c.

现在我们可以了解每个案例:

> a = a,c,其中a = 1,c = 3.

这变成:评估b,c – > (2,3),然后将其分配给 – > a =(2,3).然后将其分配给a,b,所以a = 2,b = 3.结果:a = 2,b = 3,c = 3.
> b = a,c = 3.

与之前的情况相同,但现在首先设置b =(2,然后再次设置b = 3,结果与情况1相同.
> c = a,c = 3.

右侧输入与情况1和2相同,但现在我们首先设置c =(2,3).最终结果如预期,a = 2,c =(2,3).
> d = a,c = 3.

与案例3相同,但现在我们设置了d.没有惊喜.

让你感到困惑的是,在评估右侧之后,分配从左到右处理,而不是从右到左处理.

对于像这样的情况,它实际上最容易运行你的代码(包含在一个函数中),通过dis.dis() function来反汇编python字节码:

>>> import dis>>> def f(): a=a,c... >>> dis.dis(f)  1           0 LOAD_FAST                0 (b)              3 LOAD_GLOBAL              0 (c)              6 BUILD_TUPLE              2              9 DUP_top                          10 STORE_FAST               1 (a)             13 UNPACK_SEQUENCE          2             16 STORE_FAST               1 (a)             19 STORE_FAST               0 (b)             22 LOAD_CONST               0 (None)             25 RETURN_VALUE

这是第一个案例;请注意在BUILD_TUPLE和DUP_top *** 作码之后(后者在堆栈上创建额外的副本以提供额外的赋值),首先发生的是a上的STORE_FAST *** 作,后跟UNPACK_SEQUENCE(元组赋值 *** 作码),然后将结果存储到a和b中.

总结

以上是内存溢出为你收集整理的简单的赋值运算符在Python中变得复杂全部内容,希望文章能够帮你解决简单的赋值运算符在Python中变得复杂所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1194873.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存