有趣的是,当我第一次更改变量类型时,它导致添加 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为什么以不同的方式处理它们。
答案 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
对象的引用计数递减,如果为零,则成为破坏对象。
没有str
或int
方法或函数会更改这些对象,它们会返回一个新对象,因为这些对象是只读的或不可变的。
那还是理论。 python的实现可能会优化int
和str
,因为它们是常见对象,但这对程序员来说应该是不可见的。