Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_Python 2.7 - Fatal编程技术网

python上的列表总是附加相同的值

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

我在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'] = 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,它真的帮助了我,你的解释和类比太棒了!对不起,这是个错误,现在已经更正了。谢谢