Re: [问题] +=问题

楼主: zerof (猫橘毛发呆雕像)   2017-05-16 12:51:14
前文 43
→ bibo9901: 其实像C,C++,C#那样其实会造成更多坑 05/15 23:29
→ bibo9901: 例如 a += b += c 到底谁先谁后? a += b += a ? 05/15 23:30
推 tsoahans: 有点好奇在C#这会是list[12]还是list[13]? 05/16 08:45
→ uranusjr: a += b 会直接被展开成 a = a + b, 然后 assignment 05/16 08:58
→ uranusjr: expression 会回传左值, 所以上面的结果对等于 list[13] 05/16 08:59
→ uranusjr: += 其实算简单, Python 的 assignment 不回传值反而特殊 05/16 09:00
in-place 的 method 是可以回传原值的,只要重载 += 的 protocol __iadd__ 的
时候 return self 就可以了。((但我回文不是为了讲这个...
在 OOP 里,这被称为 Method chaining (in-place 修改完后会回传原值是因为这
个 idiom), Python 虽然也是 OOP 语言,但 Guido 对于这个 idiom 有不同的立
场(注1),所以 in-place 在 Python 的实作基本上都是回传 None 。
注:
1. https://mail.python.org/pipermail/python-dev/2003-October/038855.html
2. 开始学 FP 之后变得蛮认同这点的。除了可读性较高外,这跟 explict self
一样具有提醒的作用。明确的考量 mutable/immutable 跟 side-effect 比起
方便的 method chaining 来得优雅许多。((个人意见QQ
作者: bibo9901 (function(){})()   2016-05-15 23:29:00
其实像C,C++,C#那样其实会造成更多坑例如 a += b += c 到底谁先谁后? a += b += a ?
作者: tsoahans (ㄎㄎ)   2016-05-16 08:45:00
有点好奇在C#这会是list[12]还是list[13]?
作者: uranusjr (←這人是超級笨蛋)   2016-05-16 08:58:00
a += b 会直接被展开成 a = a + b, 然后 assignmentexpression 会回传左值, 所以上面的结果对等于 list[13]+= 其实算简单, Python 的 assignment 不回传值反而特殊

Links booklink

Contact Us: admin [ a t ] ucptt.com