python上的列表总是附加相同的值
我在while循环中有以下代码python上的列表总是附加相同的值,python,list,python-2.7,Python,List,Python 2.7,我在while循环中有以下代码 if gender == 0 and len(men) < 51 : height = float((random.uniform(1.3, 1.9) + (random.randint(10, 20)/100.)).__format__('.2f')) weight = float((random.uniform(45, 100) * height).__format__('.2f')) attr['height'] = heigh
if gender == 0 and len(men) < 51 :
height = float((random.uniform(1.3, 1.9) + (random.randint(10, 20)/100.)).__format__('.2f'))
weight = float((random.uniform(45, 100) * height).__format__('.2f'))
attr['height'] = height
attr['weight'] = weight
men.append(attr)
总是一样的。但是,如果我不使用attr[height]=height;attr['weight]=weight
并使用men.append(身高);男子。附加(重量)
我得到以下结果:
[{'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}, {'weight': 76.64, 'height': 1.75}]
印刷工人
[1.91, 145.95, 1.64, 95.66, 2.0, 159.94, 1.74, 143.36, 1.68, 97.99, 1.6, 90.11, 1.63, 116.2, 1.56, 96.8, 2.04, 198.56, 1.56, 145.96, 1.44, 67.57, 1.83, 94.97, 1.85, 175.69, 1.84, 101.84, 1.54, 135.0, 1.41, 101.23, 1.92, 167.59, 1.74, 142.55, 1.49, 129.07, 1.83, 161.28, 1.59, 97.16, 1.46, 134.53, 2.03, 158.72, 2.05, 184.43, 1.97, 162.81]
如果我在循环中打印attr,它总是有一个不同的值(这就是我想要的)。但当我将其附加到列表中时,列表的值总是相同的。我做错了什么?您多次将相同的
attr
字典添加到列表中。以下几行只会改变attr
字典,而不会创建新字典:
attr['height'] = height
attr['weight'] = weight
每次都应创建一个新的dict,例如:
attr = {'height': height, 'weight': weight}
all_items = []
for i in range(0,5):
new_item = {'a': i, 'b': i}
all_items.append(new_item)
print hex(id(new_item))
print all_items
为了避免在循环中重新初始化(您错过的步骤)变量并将其附加到列表中所涉及的歧义,Python允许您更加简洁
height = float((random.uniform(1.3, 1.9) + (random.randint(10, 20)/100.)).__format__('.2f'))
men.append({
'height': height,
'weight': float((random.uniform(45, 100) * height).__format__('.2f')),
})
应该在for循环内部而不是在for循环外部使用dictionary的定义
for i in range(0, 10):
attr = {}
if gender == 0 and len(men) < 51 :
height = float((random.uniform(1.3, 1.9) + (random.randint(10,20)/100.)).__format__('.2f'))
weight = float((random.uniform(45, 100) * height).__format__('.2f'))
attr['height'] = height
attr['weight'] = weight
men.append(attr)
范围(0,10)内的i的:
attr={}
如果性别==0,而男(男)<51:
高度=float((random.uniform(1.3,1.9)+(random.randint(10,20)/100.)。_u格式__u('.2f'))
重量=浮动((随机。均匀(45100)*高度)。_u格式_uu('.2f'))
属性['height']=高度
属性['weight']=重量
男子附加(attr)
这给了我以下输出:
体重:126.75,身高:1.76,体重:155.35,身高:1.91,体重:169.2,身高:1.87,体重:135.54,身高:1.45,体重:98.58,身高:1.98,体重:133.73,身高:1.44,体重:149.48,身高:1.87,体重:121.93,身高:1.46,体重:160.09,身高:1.93,{'weight':115.62,'height':1.56}]您的问题是,您正在反复变异一个
dict
并附加相同的dict
。您应该每次创建一个新的dict
使用round
而不是转换为str并返回到float也更为清晰
if gender == 0 and len(men) < 51 :
height = round(random.uniform(1.3, 1.9) + (random.randint(10, 20)/100.), 2)
weight = round(random.uniform(45, 100) * height, 2)
men.append({'height' : height, 'weight', weight})
如果性别==0且男(男)<51:
高度=圆形(随机均匀(1.3,1.9)+(随机均匀(10,20)/100.),2)
重量=圆形(随机。均匀(45100)*高度,2)
追加({'height':height,'weight',weight})
一个简化的代码示例,用于更全面地解释为什么结果是这样的:
all_items = []
new_item = {}
for i in range(0,5):
new_item['a'] = i
new_item['b'] = i
all_items.append(new_item)
print new_item
print hex(id(new_item)) # print memory address of new_item
print all_items
请注意,每次通过循环时,对象的内存地址都是相同的。这意味着每次添加的对象都是相同的。因此,当打印最终列表时,在循环中的每个位置打印相同对象的坐标
每次通过循环时,值都会被更新—假设您每天都在同一面墙上绘画。第一天,它可能是蓝色的。第二天,您重新绘制同一面墙(或对象)然后它是绿色的。最后一天你把它漆成橙色,它是橙色的-同一堵墙现在总是橙色的。你对attr
对象的引用就像说你有同一堵墙
即使你在画完墙后看了看,颜色也变了。但画完后,它是一堵橙色的墙——即使你看了5次
当我们在每次迭代中将对象作为新对象时,请注意发生了两件事:
all_items = []
for i in range(0,5):
new_item = {}
new_item['a'] = i
new_item['b'] = i
all_items.append(new_item)
print hex(id(new_item))
print all_items
您也可以采用不同的方式,例如:
attr = {'height': height, 'weight': weight}
all_items = []
for i in range(0,5):
new_item = {'a': i, 'b': i}
all_items.append(new_item)
print hex(id(new_item))
print all_items
甚至在一个步骤中:
all_items = []
for i in range(0,5):
all_items.append({'a': i, 'b': i})
print all_items
因此,以下任一项都将起作用:
attr = {}
attr['height'] = height
attr['weight'] = weight
men.append(attr)
或:
请更新您的帖子并包含循环以获得清晰的图片。请修复您的缩进。看起来您正在更新同一个dict,您可能只需要一个新的dict或一份副本,例如
attr={'height':height,'weight':weight}
或men.append(attr.copy())
@AChampion哈哈,是的,你用30秒打败了我。谢谢你,它解决了我的问题。但是,你能更好地解释一下我做错了什么吗?谢谢你教我一种更好的编程方法。我想Selcuk的答案就是你要找的解释。你的旧代码不起作用的原因是它没有机会简化y更新现有字典中的值;始终通过{}隐式创建新字典语法。当局部变量“height”不再定义时,这怎么可能起作用?哎呀,重点是。这就是你不阅读就复制和粘贴时发生的情况。:)我会编辑答案。谢谢,但我不明白为什么我要使用print attr。在循环中,它显示我想要的值,但当我将它附加到列表中时,它将显示它的附加值错误的值。@Caaarlos我添加了更多的解释和类比,希望能有所帮助。是的@enderland,它真的帮助了我,你的解释和类比太棒了!对不起,这是个错误,现在已经更正了。谢谢