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

为什么python会奇怪地处理变量?,python,python-3.x,Python,Python 3.x,有趣的是,当我首先更改变量类型时,它导致了一个错误,即添加str和int: 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','1

有趣的是,当我首先更改变量类型时,它导致了一个错误,即添加strint

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会以不同的方式处理它们。

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

int(each)
不会更改
each
的值或类型,将删除
int(each)
的返回值。因此,第一个代码中的行
int(each)
对以后的执行没有任何用处。

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

返回一个由数字或字符串x构造的整数对象,如果没有参数,则返回0


这是因为整数、字符串、元组和其他类型是不可变的,因此不能修改,而必须创建一个新实例。另一方面,列表、集合和其他类型是可变的,因此它们的值可以更改,这就是为什么它们的方法不返回修改过的列表,而是就地修改它。

从文档中,我们可以看到
int()
修改传递给它的项(例如,
list.insert
)因为返回了一个新的整数对象

返回一个由数字或字符串x构造的整数对象,如果没有参数,则返回0


这是因为整数、字符串、元组和其他类型是不可变的,因此不能修改,而必须创建一个新实例。另一方面,列表、集合和其他类型是可变的,因此它们的值可以更改,这就是为什么它们的方法不返回修改过的列表,而是就地修改它。

int
是类的名称:

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

object-name = class-name(constructor-parameters)
所以当你这样做的时候:

int(each)
您正在创建一个新的
int
对象,但没有为其指定名称

each = int(each)
将使用
each
引用的
str
对象调用
int
构造函数。这将返回一个新的
int
对象,每个
对象的名称现在都指向该对象。原始
str
对象的引用计数递减,如果为零,则成为销毁的候选对象

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


这就是理论。python的实现可能会优化
int
str
,因为它们是如此常见的对象,但是程序员应该看不到这些细节。

int
是一个类的名称:

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

object-name = class-name(constructor-parameters)
所以当你这样做的时候:

int(each)
您正在创建一个新的
int
对象,但没有为其指定名称

each = int(each)
将使用
each
引用的
str
对象调用
int
构造函数。这将返回一个新的
int
对象,每个
对象的名称现在都指向该对象。原始
str
对象的引用计数递减,如果为零,则成为销毁的候选对象

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


这就是理论。python的实现可能会优化
int
str
,因为它们是如此常见的对象,但是程序员应该看不到这些细节。

您需要将更改存储在变量中。例如:
each=int(each)
您需要将更改存储在变量中。例如:
each=int(each)
对不起,不变性并不是这个语法不起作用的原因,例如
set(some-list)
不会改变
some-list
即使
list
set
对象是可变的。@cdarke我同意,然而,我并没有说在所有情况下,函数或方法都是在可变类型上调用的,变量是在适当的位置修改的,只是在某些情况下它们会修改,这只是因为它们是可变的。也就是说,没有不可变类型的方法或函数可以在修改不可变类型的不可变类型上调用-这就是不可变(不可变)的不同含义。很抱歉,如果我的措辞不正确,它会反过来出现。很抱歉,不变性不是此语法不起作用的原因,例如,
set(some_list)
不会更改
some_list
,即使
list
set
对象是可变的。@cdarke我同意,然而,我并没有说在所有情况下,函数或方法都是在可变类型上调用的,变量是在适当的位置修改的,只是在某些情况下它们会修改,这只是因为它们是可变的。也就是说,没有不可变类型的方法或函数可以在修改不可变类型的不可变类型上调用-这就是不可变(不可变)的不同含义。对不起,如果我的措词不正确,而它又反过来了。