为什么Python中没有++和——运算符?
当前回答
我相信这源于Python的信条“显式优于隐式”。
其他回答
这可能是因为@GlennMaynard将这个问题与其他语言进行了比较,但在Python中,你用Python的方式做事。这不是一个“为什么”的问题。它在这里,你可以用x+=做同样的事情。在Python的禅宗中,它被赋予:“应该只有一种方法来解决一个问题。”多重选择在艺术上很好(表达自由),但在工程上很糟糕。
我对python为什么没有++操作符的理解如下:当你用python写这个时,a=b=c=1,你会得到三个变量(标签)指向同一个对象(值为1)。你可以使用id函数来验证这一点,它将返回一个对象内存地址:
In [19]: id(a)
Out[19]: 34019256
In [20]: id(b)
Out[20]: 34019256
In [21]: id(c)
Out[21]: 34019256
所有三个变量(标签)都指向同一个对象。现在增加变量之一,看看它是如何影响内存地址的:
In [22] a = a + 1
In [23]: id(a)
Out[23]: 34019232
In [24]: id(b)
Out[24]: 34019256
In [25]: id(c)
Out[25]: 34019256
你可以看到变量a现在指向另一个对象,变量b和c。因为你已经使用了a = a + 1,这是明确的。换句话说,你将完全另一个对象赋值给标签a。想象一下,你可以写一个++,这将表明你没有给变量赋值一个新对象,而是给旧对象赋值。所有这些东西都是为了尽量减少混淆。为了更好地理解python变量是如何工作的:
在Python中,为什么函数可以修改调用者感知到的一些参数,而不能修改其他参数?
Python是按值调用还是按引用调用?既不。
Python是按值传递还是按引用传递?
Python是按引用传递还是按值传递?
如何通过引用传递变量?
理解Python变量和内存管理
在python中模拟值传递行为
Python函数通过引用调用
像Pythonista一样编写代码:地道的Python
我知道这是一个旧线程,但最常见的用例++ I没有涵盖,即手动索引集时,没有提供索引。这种情况就是python提供enumerate()的原因
示例:在任何给定的语言中,当你使用像foreach这样的构造来遍历一个集合时——为了示例的目的,我们甚至会说它是一个无序的集合,你需要一个唯一的索引来区分它们
i = 0
stuff = {'a': 'b', 'c': 'd', 'e': 'f'}
uniquestuff = {}
for key, val in stuff.items() :
uniquestuff[key] = '{0}{1}'.format(val, i)
i += 1
在这种情况下,python提供了一个枚举方法,例如。
for i, (key, val) in enumerate(stuff.items()) :
我认为这与对象的可变性和不变性的概念有关。2,3,4,5在python中是不可变的。参考下图。2在此python进程之前有固定的id。
x++本质上意味着像C一样的原地增量。在C中,x++执行原地增量。因此,x=3, x++会将内存中的3增加到4,不像python中的3仍然存在于内存中。
因此,在python中,你不需要在内存中重新创建一个值。这可能会导致性能优化。
这是一个基于直觉的答案。
当然,我们可以说“Guido只是决定那样做”,但我认为问题实际上是关于这个决定的原因。我认为有以下几个原因:
它将语句和表达式混合在一起,这不是好的实践。参见http://norvig.com/python-iaq.html 它通常鼓励人们编写可读性较差的代码 语言实现中的额外复杂性,如前所述,这在Python中是不必要的
推荐文章
- 数据类vs类型。NamedTuple主要用例
- 如何从macOS完全卸载蟒蛇
- 是否有可能键入提示一个lambda函数?
- 'dict'对象没有has_key属性
- 使用Pandas groupby连接来自几行的字符串
- Pandas:给定列的数据帧行之和
- 如何避免在为Python项目构建Docker映像时重新安装包?
- 如何激活蟒蛇环境
- 省略[…]意思是在一个列表里?
- 为什么我得到“'str'对象没有属性'读取'”当尝试使用' json。载入字符串?
- 不区分大小写的列表排序,没有降低结果?
- 排序后的语法(key=lambda:…)
- 在烧瓶中返回HTTP状态代码201
- 使用python创建一个简单的XML文件
- APT命令行界面式的yes/no输入?