[英]python append to list in a for loop
下面你可以看到一段简化的代码,但我遇到的问题是清晰可见的。 我有一个充满数据的字典。 它来自一个 get 请求。 所以我不能改变结构。 我想在列表中添加 print(test(data,x)) 的 output 但列表包含其他数据。 当我查看这个问题时,我发现我必须使用.copy()/list(),但我找不到让它工作的方法。
新代码(经过一些可能的改进)
data = {"datasource": "InfluxDB", "gridPos": {"h": 4, "w": 3, "x": 3, "y": 14}, "id": 80, "targets": [{"measurement": "database"}, {"measurement": "database"}],"title": "Name"}
test_list = []
def test(data,database):
data = data.copy()
data['gridPos']['x'] += data['gridPos']['w'] + 1
data['gridPos']['y'] += data['gridPos']['h'] + 1
data['id'] += 1
data['targets'][0]['measurement'] += str(database)
return data
for x in range(0,10):
data = test(data,x)
test_list.append(data.copy())
test_list
data = {"datasource": "InfluxDB", "gridPos": {"h": 4, "w": 3, "x": 3, "y": 14}, "id": 80, "targets": [{"measurement": "database"}, {"measurement": "database"}],"title": "Naam"}
test_list = []
def test(data,database):
data['gridPos']['x'] += data['gridPos']['w'] + 1
data['gridPos']['y'] += data['gridPos']['h'] + 1
data['id'] += 1
data['targets'][0]['measurement'] += str(database)
return data
for x in range(0,10):
print(test(data,x))
test_list.append(test(data,x).copy())
print(test_list)
print(test(data,x)) (在 for 循环中)
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 7, 'y': 19}, 'id': 81, 'targets': [{'measurement': 'database0'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 15, 'y': 29}, 'id': 83, 'targets': [{'measurement': 'database001'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 23, 'y': 39}, 'id': 85, 'targets': [{'measurement': 'database00112'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 31, 'y': 49}, 'id': 87, 'targets': [{'measurement': 'database0011223'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 39, 'y': 59}, 'id': 89, 'targets': [{'measurement': 'database001122334'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 47, 'y': 69}, 'id': 91, 'targets': [{'measurement': 'database00112233445'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 55, 'y': 79}, 'id': 93, 'targets': [{'measurement': 'database0011223344556'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 63, 'y': 89}, 'id': 95, 'targets': [{'measurement': 'database001122334455667'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 71, 'y': 99}, 'id': 97, 'targets': [{'measurement': 'database00112233445566778'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 79, 'y': 109}, 'id': 99, 'targets': [{'measurement': 'database0011223344556677889'}, {'measurement': 'database'}], 'title': 'Name'}
打印(测试列表)
[{'datasource': 'InfluxDB',
'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
'id': 82,
'targets': [{'measurement': 'database00112233445566778899'},
{'measurement': 'database'}],
'title': 'Name'},
{'datasource': 'InfluxDB',
'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
'id': 84,
'targets': [{'measurement': 'database00112233445566778899'},
{'measurement': 'database'}],
'title': 'Name'},
{'datasource': 'InfluxDB',
'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
'id': 86,
'targets': [{'measurement': 'database00112233445566778899'},
{'measurement': 'database'}],
'title': 'Name'},
{'datasource': 'InfluxDB',
'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
'id': 88,
'targets': [{'measurement': 'database00112233445566778899'},
{'measurement': 'database'}],
'title': 'Name'},
{'datasource': 'InfluxDB',
'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
'id': 90,
'targets': [{'measurement': 'database00112233445566778899'},
{'measurement': 'database'}],
'title': 'Name'},
{'datasource': 'InfluxDB',
'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
'id': 92,
'targets': [{'measurement': 'database00112233445566778899'},
{'measurement': 'database'}],
'title': 'Name'},
{'datasource': 'InfluxDB',
'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
'id': 94,
'targets': [{'measurement': 'database00112233445566778899'},
{'measurement': 'database'}],
'title': 'Name'},
{'datasource': 'InfluxDB',
'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
'id': 96,
'targets': [{'measurement': 'database00112233445566778899'},
{'measurement': 'database'}],
'title': 'Name'},
{'datasource': 'InfluxDB',
'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
'id': 98,
'targets': [{'measurement': 'database00112233445566778899'},
{'measurement': 'database'}],
'title': 'Name'},
{'datasource': 'InfluxDB',
'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
'id': 100,
'targets': [{'measurement': 'database00112233445566778899'},
{'measurement': 'database'}],
'title': 'Name'}]
您的test
function 转换data
,您调用它两次 - 一次打印,一次调用 append,因此它在每次迭代中转换字典两次。 此外, copy
只制作字典的浅拷贝,但您需要深拷贝,因为它包含嵌套的字典和列表。
要解决此问题, import copy
并更改此行
test_list.append(test(data,x).copy())
至
test_list.append(copy.deepcopy(data)) # data has already been transformed so no need to call `test` again
或者更好的是,更改结构,使您的 function 没有副作用:
def test(data,database):
data = copy.deepcopy(data)
data['gridPos']['x'] += data['gridPos']['w'] + 1
data['gridPos']['y'] += data['gridPos']['h'] + 1
data['id'] += 1
data['targets'][0]['measurement'] += str(database)
return data
for x in range(10):
data = test(data,x)
print(data)
test_list.append(data)
一般来说,对于 function 来说,避免转换其参数而是返回一个新值会更干净。 如果您确实需要 function 来就地转换 object,那么可能还要避免返回相同的 object,因为这可能会导致混淆。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.