Python:append()导致无限循环
我有一些活动我想修改,但我必须调用服务器并导出所有活动设置修改或添加我想要的信息并将其发送回服务器 我的修改存储在SQLite数据库中,因此首先,我查询数据库以查找帐户ID(我可以在不同的帐户中有许多活动),然后查找每个帐户的活动Python:append()导致无限循环,python,Python,我有一些活动我想修改,但我必须调用服务器并导出所有活动设置修改或添加我想要的信息并将其发送回服务器 我的修改存储在SQLite数据库中,因此首先,我查询数据库以查找帐户ID(我可以在不同的帐户中有许多活动),然后查找每个帐户的活动 theCursor.execute('SELECT * FROM SandboxPubTB') rows = theCursor.fetchall() for row in rows: accounts.append(row[7]) for accoun
theCursor.execute('SELECT * FROM SandboxPubTB')
rows = theCursor.fetchall()
for row in rows:
accounts.append(row[7])
for account in set(accounts):
theCursor.execute('SELECT CAMPAIGNNAME, CAMPAIGNID FROM SandboxPubTB WHERE ACCOUNTID =?', (account,) )
campaignRows = theCursor.fetchall()
for campaign in campaignRows:
campId= campaign[0] + "," + campaign[1] + "," + account
campaigns.append(campId)
我的campId列表包含每个条目中的活动名称、活动ID和活动帐户ID
之后,我遍历列表,并将值分配给活动级别的变量:
for campaignNameId in set(campaigns):
campaignNameId = campaignNameId.split(',')
campaignName = campaignNameId[0]
campaignId = campaignNameId[1]
campaignAccount = campaignNameId[2]
现在是调用服务器导出活动设置的时候了:
targetUrl = "https://sites.com/api/1.0/" + campaignAccount + "/campaigns/"+ campaignId
resp = requests.get(url=targetUrl, headers=header)
r = resp.json()
temp = r['publisher_bid_modifier']['values']
如果我打印temp,这就是我得到的:
[{
'target': 'msn-can',
'cpc_modification': 0.5
}, {
'target': 'msn-can-home',
'cpc_modification': 0.5
}, {
'target': 'smartify-journalistatecom',
'cpc_modification': 0.5
}, {
'target': 'foxnews-iosapp',
'cpc_modification': 1.22
}]
最后,我被困在这里了。我要做的是遍历上面的字典列表,如果“target”值存在,并且“cpc_modification”与我在db中的值不同,我将更改cpc值。如果“target”不存在,我想在字典列表中添加“target”和“cpc\u modification”
我成功地完成了第一部分,但附加部分有所不同。在elif中,即使我使用else,temp.append也会触发一个无限循环,我不知道为什么
for dt in r['publisher_bid_modifier']['values']:
#print(dt['target'])
#if dt['target']:
theCursor.execute('SELECT ADJUST, SITE FROM SandboxPubTB WHERE CAMPAIGNNAME =?', (campaignName,) )
campaignRows = theCursor.fetchall()
for t in campaignRows:
if t[1] == dt['target'] :
dt['cpc_modification'] = "{:.2f}".format((int(t[0]) / 100) + 1)
elif dt['target'] not in temp:
temp.append("{'target': "'" + t[1] + "'", 'cpc_modification': "'" + str(t[0]) + "'"}")
这很奇怪,因为我试着用一个局部变量来模拟相同的行为,它似乎可以毫无问题地工作
data = [{
"target": "publisher1",
"cpc_modification": 1.5
},
{
"target": "publisher2",
"cpc_modification": 0.9
}
]
for t in data:
if t['target'] == "publisher10":
t['cpc_modification'] = 1.9
else:
data.append({'target': 'publisher10', 'cpc_modification': 12})
print(t['target'], t['cpc_modification'])
print(data)
我试过很多方法,但我不知道哪里出了问题。我相信你的问题就在这里。您正在迭代“数据”,但在迭代“数据”时,您也在向“数据”添加内容。您应该创建一个要附加到的新变量
temp = data
for t in data:
if t['target'] == "publisher10":
t['cpc_modification'] = 1.9
else:
temp.append({'target': 'publisher10', 'cpc_modification': 12})
print(t['target'], t['cpc_modification'])
print(temp)
我举了一个我认为正在发生的事情的例子你能把它简化为一个最小的例子吗?我不太清楚代码的哪一部分没有达到您期望的效果,以及以何种方式。
temp
和dt
指向同一个对象。因此,您同时迭代和更改对象。你需要在r['publisher\u bid\u modifier']['values'].copy():
或从copy导入deepcopy
和在deepcopy中为dt(r['publisher\u bid\u modifier']['values']:])
在迭代时不要修改列表。看起来你正在修改(就地)iterable的内容:r['publisher\u bid\u modifier']['values']
。请注意,temp=r['publisher\u bid\u modifier']['values']
只是将名称映射到该对象。您正在修改的内容与您在中为dt在中迭代的内容相同。
。FTR,第一条注释指