为什么我的字典没有在这个 while 循环中更新?

Why is my dictionary not updating in this while loop?

运行: Python 3.9.9 和 Django 4

我正在尝试组合一个等待用户输入的循环,然后将该输入附加到现有字典中。请参阅下面的代码:

def calculator(request):

    loop_int = 1
    numbers = [str(x) for x in range(0,10)]
    i = "1"
    current_nums = {'1':[],'2':[]}

    if request.GET: #wait for request.GET to return True before starting while loop

        while loop_int < 10:

            r = request.GET #store request.GET object as r

            if r: #this is here to stop the loop and wait for request.GET to return True

                print(r)

                if list(r.values())[0] in numbers:

                    digit = list(r.values())[0] #grab the value from request.GET

                    current_nums[i].append(digit) #append that value to the list at "1" in current_nums dictionary

                    print(f'digit = {digit}')
                    print(f'current_nums = {current_nums}')

                    loop_int += 1 #increment the loop_int
                    request.GET = None

    return render(request, 'calculator/calculator.html')

最后一个打印语句 print(f'current_nums={current_nums}') 显示了我期望的更新字典,但附加的数字不会在循环的下一次迭代中持续存在。代码输出如下:

<QueryDict: {'1': ['1']}>
digit = 1
current_nums = {'1': ['1'], '2': []}

<QueryDict: {'2': ['2']}>
digit = 2
current_nums = {'1': ['2'], '2': []}

此文件是 Django 项目的 views.py 文件。我在使用 request.GET.

从前端获取信息时没有遇到任何问题(据我所知)

我发现的一件奇怪的事情是,如果我在循环结束时删除语句 request.GET = None,这允许循环 运行 不间断地使用相同的值 request.GET ,然后该程序在接下来的 9 次迭代中按预期工作,并且字典更新持续存在。但是,一旦我尝试设置 request.GET = None 暂停循环并等待合法的用户输入,字典更新就会停止。

我犯了一个简单的范围错误吗?还是我遗漏了 request.GET 的细微差别?

你的问题是你把current_nums放在视图函数里,每次有请求进来,都会初始化

你可以将它放在视图函数之外,如下所示,它会保存每次请求添加的数据。

class Data:
    loop_int = 1
    current_nums = {'1':[],'2':[]}
    numbers = [str(x) for x in range(0,10)]


def calculator(request):
    i = "1"

    if request.GET and Data.loop_int < 10: #wait for request.GET to return True before starting while loop

        r = request.GET #store request.GET object as r
        print(r)

        if list(r.values())[0] in Data.numbers:

            digit = list(r.values())[0] #grab the value from request.GET

            Data.current_nums[i].append(digit) #append that value to the list at "1" in current_nums dictionary

            print(f'digit = {digit}')
            print(f'current_nums = {Data.current_nums}')

            Data.loop_int += 1 #increment the loop_int

    return render(request, 'calculator/calculator.html')

单人本地测试还是可以用的。如果涉及多并发,需要加锁。