使用str()[关闭]时出错

问题描述 投票:-6回答:2

尝试运行几天前正在运行的代码时出现了一个奇怪的错误。添加小功能,根本不使用str()得到

UnboundLocalError:赋值前引用的局部变量'str'

结果是。引用的部分根本没有被触及。 这是片段。 (如果需要更多我的代码,我会编辑我的帖子):

def get_level_stats(number,version,prev_uniques):
    starts = events.find({"eventName":"Level " + str(number),"gameVersion":{"$in": version }, "status": "start"})
    fails =  events.find({"eventName":"Level " + str(number),"gameVersion":{"$in": version }, "status": "failed"})
    finishes = events.find({"eventName":"Level " + str(number),"gameVersion":{"$in":version }, "status": "finish"})
    players_dict = {}


     for result in starts:

        try:
            players_dict[result['uid']]
            players_dict[result['uid']]["starts"] = players_dict[result['uid']]["starts"] +1
            players_dict[result['uid']]["last_day"] = result['updated_at']

        except:
            players_dict[result['uid']] = {}
            players_dict[result['uid']]["starts"] = 1
            players_dict[result['uid']]["finish"] = 0
            players_dict[result['uid']]["booster"] = 0
            players_dict[result['uid']]["extra"] = 0
            players_dict[result['uid']]["last_day"] = result['updated_at']


    for result in finishes:
        try:
            players_dict[result['uid']]
            players_dict[result['uid']]["finish"] = players_dict[result['uid']]["finish"] +1
            players_dict[result['uid']]["bubbles_left"] = result['bubbles_left']
            if int(result['use_special']) >= 1:
               players_dict[result['uid']]["booster"] = players_dict[result['uid']]["booster"] + 1
        except:
            players_dict[result['uid']] = {}
            players_dict[result['uid']]["finish"] = 0


    print(players_dict)

    try:
        dificulty = 1.-finishes.count()/starts.count()
    except:
        dificulty = 1
    uniques = len(players_dict.keys())
    if number >= 2:
        dropedPeople = prev_uniques/ uniques
    else:
        dropedPeople = 0


    test = players_dict
    for fin in finishes:
        test[result['uid']]["starts"] = 0
        if fin['updated_at'] < test['last_day']:
            test[fin['uid']]['last_day'] = fin['updated_at']
            for str in starts:
                if str['updated_at'] < test['last_day']:
                    test[result['uid']]["starts"] = test[result['uid']]["starts"] + 1
    attemps = 0
    for player in test:
        attemps = players_dict[player]["starts"] + attemps
    average = attemps/uniques


    win_in_first_atempt = 0
    lost_people_count = 0
    bubbles_left = [0]
    bubbles_left_first_try = [0]
    fails_count = [0]
    fails_count_lost_people = [0]
    lost_percent = 0
    for player in players_dict:


        try:
            if (players_dict[player]["finish"] == 1 and players_dict[player]["starts"] == 1):
                win_in_first_atempt = win_in_first_atempt+1
                if players_dict[player]["finish"] >= 1:
                    if players_dict[player]["bubbles_left"].isdigit():
                        bubbles_left_first_try.append(players_dict[player]["bubbles_left"])

            delta = datetime.datetime.now() - players_dict[player]["last_day"]
            if (delta.days > 2 and players_dict[player]["finish"] == 0) :
            lost_people_count = lost_people_count + 1
            lost_percent =  lost_people_count/uniques


            if players_dict[player]["finish"] >= 1:
                if players_dict[player]["bubbles_left"].isdigit():
                    bubbles_left.append(players_dict[player]["bubbles_left"])


            if players_dict[player]["starts"] > 1:
                fails_count.append(players_dict[player]["starts"] - 1)
        except:
            print("some erroe")



    try:
        win_percent =  win_in_first_atempt/uniques
    except:
        win_percent = 0

    bubbles_left_first_try =  list(map(int, bubbles_left_first_try))
    bubbles_left_first_try.sort()
    bubbles_left =  list(map(int, bubbles_left))
    bubbles_left.sort()
    median_left = statistics.median(bubbles_left)

    percentile25_bubbles = np.percentile(bubbles_left, 25)
    percentile75_bubbles = np.percentile(bubbles_left, 75) 

    fails_count = list(map(int, fails_count))
    fails_count.sort()
    fails_median = statistics.median(fails_count)

    fails_percentile75 = np.percentile(fails_count, 75)

    ReturnList = [
          uniques,
          number, uniques,
          starts.count(),
          finishes.count(),
          fails.count(),
          round(dificulty*100, 2),
          win_in_first_atempt,
          round(dropedPeople*100, 2),
          median_left,
          percentile25_bubbles,
          percentile75_bubbles,
          fails_median,
          fails_percentile75,
          average]
    return ReturnList

prev = 0
  for number in range(1,3):
      res = get_level_stats(number,version,prev)
      lol = res.pop(0)
      print(res)
python python-3.x
2个回答
0
投票

我认为这条线不正确。

for str in starts:

尝试将其更改为

for strs in starts:

0
投票

发生此错误是因为Python认为str是一个局部变量。这意味着您稍后在同一函数中使用名称str来保存值。

例如:

>>> def test():
...     str(3)
...     str = 'test'
...
>>> test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in test
UnboundLocalError: local variable 'str' referenced before assignment

由于代码分配给str,Python编译器假定它是该范围内的局部变量,但在为其赋值之前不能使用局部变量,因此异常。解决方案是在代码中搜索str的出现,如果它被用作变量名,则重命名变量。

© www.soinside.com 2019 - 2024. All rights reserved.