为毛 python 没有自增自减运算?

2014-02-19 12:35:35 +08:00
 kevinroot
每次写到count += 1就ju花一紧
16122 次点击
所在节点    Python
42 条回复
dorentus
2014-02-19 12:42:52 +08:00
因为不好看……
hitsmaxft
2014-02-19 12:44:23 +08:00
因为作者很懒
loading
2014-02-19 12:46:35 +08:00
难道你还怀念考C语言
i++
++i
的头晕日子?

程序是给人看的!
tonitech
2014-02-19 12:50:08 +08:00
举个例子
foo=1
bar=1
foo现在和bar的地址实际上是相同的,
当foo+1变成2之后,它的那个啥,地址就跟之前不一样了。。。
应该说是概念不同吧。。。
chevalier
2014-02-19 12:59:18 +08:00
i++ 这种操作在C刚诞生的那会,很有用,因为相对于i=i+1可以节约两个字节的空间,那时候的内存真的在乎这两个字节。后来其他语言如Java只不过考虑到程序员的习惯沿用了这一用法。
在今天,已经不用考虑这两个字节了,为了程序的可读性,还是写成i=i+1比较好,Python中就去掉i++这种用法了。
VYSE
2014-02-19 13:08:17 +08:00
http://stackoverflow.com/questions/3654830/why-are-there-no-and-operators-in-python

我觉得第二个回答很好,++ -- 更多是为了让当年不聪明的编译器翻译成 inc operand / dec operand 而不是俩mov然后add
今天则不需要,结果养成了一种病
est
2014-02-19 13:25:44 +08:00
@VYSE python的 += 1 依然不是原子操作。。。。。
VYSE
2014-02-19 13:34:18 +08:00
@est 有GIL保障就好,毕竟不是native的
chilaoqi
2014-02-19 13:55:25 +08:00
python 追求 readability
ivenvd
2014-02-19 14:08:36 +08:00
因为 Python 基本上用不到自加自减,不是么?
tonitech
2014-02-19 14:09:44 +08:00
@VYSE 但是我觉得++很优美啊。。。
tonitech
2014-02-19 14:10:38 +08:00
@chilaoqi ++去掉就提升了readability吗?
yegle
2014-02-19 14:11:15 +08:00
@est 我靠!不是原子操作是个什么情况!!!
Ever
2014-02-19 14:12:51 +08:00
python的数值是immutable的.
zzNucker
2014-02-19 14:13:25 +08:00
看到楼主写的ju花一紧,下意识看了下tag
yegle
2014-02-19 14:24:17 +08:00
补充14楼 @Ever的说明

In [35]: i = 1

In [36]: id(i)
Out[36]: 4474635968

In [37]: i = 2

In [38]: id(i)
Out[38]: 4474636000

In [39]: i = 1

In [40]: id(i)
Out[40]: 4474635968
oio
2014-02-19 14:25:05 +08:00
看了一下,i += 1 用的是 INPLACE_ADD, i = i+1 用的是 BINARY_ADD, 这两者效率有区别?具体实现是不是得看Cpython源码....
est
2014-02-19 14:32:01 +08:00
@yegle

如果没记错的话

http://effbot.org/zone/thread-synchronization.htm

> The reason for this is that the increment operation is actually executed in three steps;

python解释器有很多脑残举动。。。比如代码里 1+1 可以自动优化成一个常量但是1 + 2 * 3就不行。


>>> from dis import dis
>>> def f(): return 1 + 2 * 3
>>> dis(f)




大家可以自己去python看看结果。v2ex贴代码比较乱就不贴了。反正笑死人了。
oldcai
2014-02-19 14:33:44 +08:00
python很多东西都没有:还比如switch,条件语句里面的赋值。
当然,以及楼主所说的++和--,这些在刚转入python的时候是让人很不习惯,我也吐槽过,但是习惯了也就好了,有其他办法实现目的。

@chevalier 编译后都是一样的,省不到,只是让编码减少一点而已。
est
2014-02-19 14:42:20 +08:00
@oldcai 这个倒是有啊

func_map = {value1: func1, value2: func2}

func_map.get(my_value, default_func)(*args, **kwargs)

巨型分支效率比switch高

哈哈哈哈。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/100890

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX