为什么python奇怪地处理变量?

时间:2018-07-08 06:27:55

标签: python python-3.x

有趣的是,当我第一次更改变量类型时,它导致添加 str int 的错误的oprand类型错误:

average = ['12','23','34','45','56','67','78','89','90','100']
avenum = 0

for each in average:
    int(each)
    avenum = avenum + each

但是在此配置中,代码将执行:

average = ['12','23','34','45','56','67','78','89','90','100']
avenum = 0
for each in average:
    avenum = avenum + int(each)

我很想知道这两者之间的区别,以及python为什么以不同的方式处理它们。

3 个答案:

答案 0 :(得分:2)

int(each)不会更改each的值或类型,而丢弃int(each)的返回值。因此,第一个代码中的行int(each)对以后的执行没有用。

答案 1 :(得分:2)

从文档中,我们看到int()不会修改传递给它的项目(例如list.insert),因为返回了一个新的整数对象。< / p>

  

返回由数字或字符串x构成的整数对象,如果未提供任何参数,则返回0。

这样做的原因是整数,字符串,元组和其他类型是不可变的,因此不能修改 -必须创建一个新实例。另一方面,列表和集合和其他类型是可变的,因此可以更改其值,这就是为什么它们具有的方法不会返回修改后的列表,而是在适当位置进行修改的原因。

答案 2 :(得分:1)

int class 的名称:

>>> each = 42
>>> isinstance(each, int)
True

在python中,我们使用通用语法创建给定类的对象:

object-name = class-name(constructor-parameters)

因此,当您这样做时:

int(each)

您正在创建一个新的int对象,但没有为其分配名称。

each = int(each)

将使用int引用的str对象调用each构造函数。这将返回一个新的int对象,名称each现在指向该对象。原始str对象的引用计数递减,如果为零,则成为破坏对象。

没有strint方法或函数会更改这些对象,它们会返回一个新对象,因为这些对象是只读的或不可变的

那还是理论。 python的实现可能会优化intstr,因为它们是常见对象,但这对程序员来说应该是不可见的。