我想从用户那里获取输入并初始化词典列表。 我有以下块可以正常工作。
people = []
for p in range(3):
cell = {"name": "","age" : 0, "education" : "","height" : 0}
cell["name"] = input("name:")
cell["age"] = int(input("age:"))
cell["education"] = input("education:")
cell["height"] = float(input("height:"))
people.append(cell)
我遇到的问题是为什么以下块对我不起作用。
people = []
cell = {"name": "","age" : 0, "education" : "","height" : 0}
for p in range(0,3):
cell["name"] = input("name:")
cell["age"] = int(input("age:"))
cell["education"] = input("education:")
cell["height"] = float(input("height:"))
people.append(cell)
我不明白为什么在迭代结束时我将列表初始化为最新输入3次,我的意思是当我使用这一行时:
cell["name"] = input("name:")
不应该用新的值替换先前的值吗?
答案 0 :(得分:3)
重要的是这一行:
cell = {"name": "","age" : 0, "education" : "","height" : 0}
在这里创建字典并在cell
如果在循环之前执行此操作(如第二个示例中所示),则只创建一个字典并将其附加到列表三次。因此,如果您更改任何字典中的任何内容,您的更改将显示在列表的所有索引中(因为它们都指向同一个字典)
但是,如果你在循环内部运行这行,你实际上创建了三个不同的词典,这基本上就是你想要的。这就是为什么你的第一个例子有效,而你的第二个例子没有。
答案 1 :(得分:1)
这是传递值和传递引用之间的区别。通过引用或其他语言术语的指针传递意味着变量指向内存中的某个点。在Python中,字典以这种方式运行,这意味着,在第二个版本中,您更改字典中存在的内容然后附加它,您实际在做的是将SAME字典附加到数组第二(和第三)时间。在每个时间之间,它碰巧会改变它的值,但是当你在最后查看数组时,SAME更新的字典会出现三次。
在第一个示例中,您将每个循环实例化cell
变量的新副本,这会导致不同的内存位置。它基本上每次都是一个不同的字典,在这种情况下,它会为您提供您正在寻找的结果。
答案 2 :(得分:1)
上一个值是否已被删除,新的值是否已被删除?
没有!这是因为每个循环都会修改相同的对象,因为引用没有改变。这就是为什么你有最后一次迭代值出现三次。
尝试:
for p in range(0,3):
cell = {"name": "","age" : 0, "education" : "","height" : 0}
cell["name"] = input("name:")
cell["age"] = int(input("age:"))
cell["education"] = input("education:")
cell["height"] = float(input("height:"))
people.append(cell)