Python对象列表与原语列表
以下是MWE:Python对象列表与原语列表,python,list,object,Python,List,Object,以下是MWE: class Foo(): 定义初始化(自身,数据): self.data=数据 定义报告(自我): 返回str(self.data) 对象列表=[Foo(10)、Foo(80)、Foo(50)、Foo(60)、Foo(20)] int_列表=[10,80,50,60,20] 打印(“修改前对象列表:{}”。格式(对象列表)) 打印(“修改前的整数列表:{}”。格式(整数列表)) 对于对象列表中的i: i、 数据+=5 对于int_列表中的j: j+=5 打印(“”) 打印(“修改
class Foo():
定义初始化(自身,数据):
self.data=数据
定义报告(自我):
返回str(self.data)
对象列表=[Foo(10)、Foo(80)、Foo(50)、Foo(60)、Foo(20)]
int_列表=[10,80,50,60,20]
打印(“修改前对象列表:{}”。格式(对象列表))
打印(“修改前的整数列表:{}”。格式(整数列表))
对于对象列表中的i:
i、 数据+=5
对于int_列表中的j:
j+=5
打印(“”)
打印(“修改后的对象列表:{}”。格式(对象列表))
打印(“修改后的整数列表:{}”。格式(整数列表))
结果如下:
Object list before modification: [10, 80, 50, 60, 20]
Integer list before modification: [10, 80, 50, 60, 20]
Object list after modification: [15, 85, 55, 65, 25]
Integer list after modification: [10, 80, 50, 60, 20]
为什么结果不同?在我看来,整数结果似乎更自然,因为我们并没有在列表上精确地执行操作(比如
对于范围内的idx(len(object\u list)):object\u list[idx]。data+=5
)。我们在取出元素后,将其应用于元素。这就是增广赋值的奇怪之处。“+=”需要三个步骤:1)从左侧获取值,2)在右侧添加值3)将结果存储回左侧的变量中
在第一种情况下,左侧是i.data
,并且i.data
被重新分配给结果。由于i
中的对象位于原始列表中,因此其重新分配的属性“data”显示了更改
在第二种情况下,左侧为
j
。它正确地更新了,但是由于j
没有保存在任何地方,它的值就丢失了。Python没有原语。一切都是对象。一切。包括int
对象。无论如何,这很简单。在一种情况下,您的列表中有可变对象,Foo
,并且您对该对象进行了变异,i.data+=5
将变异被i
引用的Foo
对象。在第二种情况下,您有一个不可变的对象,int
,并且j+=5
创建一个新的int对象并将其分配给j
“我们宁愿在取出元素后将其应用于元素。”当然,但对象尚未从列表中删除,它们仍在列表中引用。我建议您搜索一下为什么增量运算符“++”在Python中不起作用。@user70您的意思是什么++
在其他语言中是+=1
的缩写,不是吗?