为什么我的字典没有在这个 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')
单人本地测试还是可以用的。如果涉及多并发,需要加锁。
运行: 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')
单人本地测试还是可以用的。如果涉及多并发,需要加锁。