Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python对象列表与原语列表_Python_List_Object - Fatal编程技术网

Python对象列表与原语列表

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 打印(“”) 打印(“修改

以下是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
打印(“”)
打印(“修改后的对象列表:{}”。格式(对象列表))
打印(“修改后的整数列表:{}”。格式(整数列表))
结果如下:

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
的缩写,不是吗?