Snakify第6课while循环第3题两种实现差异及原理疑问
疑问解答
你的代码和官方给出的参考代码逻辑完全等价,运行结果没有任何差异,只是写法风格不同,以下是对你三个疑问的逐一说明:
- 关于删除
x*2报错的问题
这行y, x = y+1, x*2是Python的元组解包赋值语法:等号左侧如果是逗号分隔的多个变量,右侧必须提供对应数量的可迭代值。你删除x*2后,右侧只有y+1一个整数类型的值,无法拆分给2个变量,就会抛出cannot unpack non-iterable int object的报错。这里的x*2作用是生成x更新后的值,和前面的y+1组成两个值的序列,按顺序对应赋值给左侧的y和x。 - 关于并行赋值的逻辑原理
这种逗号分隔的赋值叫并行赋值,Python执行时会先把等号右侧所有表达式的结果全部计算完成,再按顺序赋值给左侧的变量。执行这行代码时,会先计算当前循环下y+1的结果、再计算x*2的结果,再把第一个结果赋值给y,第二个结果赋值给x,和你分开写两行y += 1、x *= 2的效果完全一致。你之前误以为是x = y+1是搞错了左右的对应关系:左侧变量的顺序和右侧值的顺序严格一一对应,所以y会拿到y+1的结果,每次循环自然会递增1。 - 关于写法的效率问题
这种写法和你分开两行写的效率差异可以忽略不计,官方推荐这种写法和效率没有关系,主要是Python的语法风格习惯:把两个关联的变量更新操作放在同一行,能更直观地体现两个变量的更新是绑定的同组逻辑,代码更简洁易读。如果硬要抠底层差异,并行赋值只会减少一次变量标识符查找的开销,对于本题而言循环次数最多不会超过60次(2^60已经远超过常规整数输入的范围),这点性能差异完全感知不到。
内容的提问来源于stack exchange,提问作者Student6334
相关产品推荐
相关产品推荐

