在类替换的时候,突然混淆了索引还是item,仔细想了想写下来
先来判断对错
numbers = [1, 2, 3]
for item in numbers:
item = 10
print(numbers)
你觉得输出结果是
numbers = [1, 2, 3]
还是
numbers = [10, 10, 10]
先说答案,正确的是:
numbers = [1, 2, 3]
列表替换用索引还是item解析
在遇到列表替换需求的时候,for item来更新内容是分情况的:
1. 为了搞懂这个,你需要复习一下基本数据类型:
如果列表包含的是不可变的数据类型(如整数、浮点数、字符串、元组等),那么修改这些基本类型的 item 不会改变列表中的内容。在 Python 中,这些类型是通过值传递的,所以修改 item 只会改变该变量的本地副本,而不会影响列表中的原始数据。
numbers = [1, 2, 3]
for item in numbers:
item = 10 # 这只修改了 item,不会改变列表中的值
2. 同样,如果涉及浅拷贝或者切片也是不会改变元数据
numbers = [1, 2, 3]
for item in numbers[:]: # numbers[:] 创建了一个列表的副本
item = 10 # 这只修改了副本中的元素,原始列表保持不变
3. 那么什么时候可以使用item来更新原列表数据呢?
list01 = [[1, 2], [15, 17]]
for item in list01:
item[0] = 5
在这个具体的例子中,循环结束后,list01 将变为 [[5, 2], [5, 17]]。每个子列表的第一个元素都被改成了 5,因为修改了每个子列表中索引为 0 的元素。这是因为 item 在循环中指向的是列表中的子列表对象,所以对 item 所做的更改直接影响了 list01。
如果你觉得以上很容易理解,那么看一下在类中替换应该也能懂了:
class TestModel:
def __init__(self, name=""):
self.name = name
self.sid = sid
class TestVive:
def __init__(self):
self.controller.update_test(stu)
def modify_test(self):
target = TestModel()
target.sid = int(input("请输入编号:"))
target.name = input("请输入学生姓名:")
if self.controller.update_test(stu):
class TestController:
def __init__(self):
self.list_test = []
self.start_sid = 1
def update_test(self,target):
for item in self.list_test:
if item.sid == targetu.sid:
item.__dict__ = target.__dict__
这里的
item.__dict__ = target.__dict__
就是利用了上述 “3那么什么时候可以使用item来更新原列表数据呢?” 中所讲的知识点。