Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从while循环中更改f-string局部变量?_Python_Variables_F String - Fatal编程技术网

Python 从while循环中更改f-string局部变量?

Python 从while循环中更改f-string局部变量?,python,variables,f-string,Python,Variables,F String,我想使用f字符串查询sqlite数据库,它应该返回一个小的描述,给定我存储在局部变量var中的特定id。但是,对于变量的某些值,某些字段将为空。我对值0特别感兴趣,因为它总是返回一个空描述,并且是一个孤立的情况,需要以不同于其他值的方式处理 我想遍历一个范围,直到找到一个非空的描述字段。 以下是一个例子: var = str(self.some_global_variable) # In this case consider var = '0' query = f'my sql query

我想使用f字符串查询sqlite数据库,它应该返回一个小的
描述
,给定我存储在局部变量
var
中的特定
id
。但是,对于变量的某些值,某些字段将为空。我对值0特别感兴趣,因为它总是返回一个空描述,并且是一个孤立的情况,需要以不同于其他值的方式处理

我想遍历一个范围,直到找到一个非空的描述字段。 以下是一个例子:

var = str(self.some_global_variable)  # In this case consider var = '0'

query = f'my sql query goes here WHERE this_id={var}'

description = self.function_to_fetch_db(query)

while not description and var == '0':
   for i in range (1, 31):
      var = str(i)
      description = self.function_to_fetch_db(query)
      print(description, var)
      print(query)
其输出类似于:

[] 1
my sql query goes here WHERE this_id=0
[] 2
my sql query goes here WHERE this_id=0
[] 3
my sql query goes here WHERE this_id=0
.
.
.
局部变量已更新,但查询始终保持while循环外部的原始值

我还尝试了
if…else
而不是
while
循环,但结果是一样的。
我不认为问题的SQLite部分是相关的,只是为了说明我的具体情况,查询适用于其他值。我只是很难理解这个局部变量和f字符串的关系。

你的问题有两个答案:第一个是正式的,第二个是正确的

正式答案是:在您的案例中,字符串在循环之前计算一次。如果希望它针对每个值进行更改,请将其移到内部:

for i in range(31):
    query = f'my sql query goes here WHERE this_id={i}'
    description = self.function_to_fetch_db(query)
正确答案:改用参数化查询,如下所示:

 conn.execute('my sql query goes here WHERE this_id=?', (i,))

(替换语法可能因数据库/驱动程序而异。)

您的问题有两个答案:第一个是正式的,第二个是正确的

正式答案是:在您的案例中,字符串在循环之前计算一次。如果希望它针对每个值进行更改,请将其移到内部:

for i in range(31):
    query = f'my sql query goes here WHERE this_id={i}'
    description = self.function_to_fetch_db(query)
正确答案:改用参数化查询,如下所示:

 conn.execute('my sql query goes here WHERE this_id=?', (i,))

(替换语法可能因数据库/驱动程序而异。)

您可以在字符串中使用命名变量:

var = str(self.some_global_variable)  # In this case consider var = '0'

fquery = 'my sql query goes here WHERE this_id={var}'

description = self.function_to_fetch_db(fquery.format(var=var))

while not description and var == '0':
    for i in range(1, 31):
        query = fquery.format(var=i)
        description = self.function_to_fetch_db(query)
        print(description, i)
        print(query)

可以在字符串中使用命名变量:

var = str(self.some_global_variable)  # In this case consider var = '0'

fquery = 'my sql query goes here WHERE this_id={var}'

description = self.function_to_fetch_db(fquery.format(var=var))

while not description and var == '0':
    for i in range(1, 31):
        query = fquery.format(var=i)
        description = self.function_to_fetch_db(query)
        print(description, i)
        print(query)
print(query)
是否为每个循环打印不同的查询?另请参见:否,
print(query)
将是
我的sql查询位于此处,此处id=0
,遵循bereal的建议,将查询移动到循环内,但修复了它,我可以根据发布的链接标记了解原因(很抱歉,在搜索此循环时忽略了这个问题,但现在它确实有意义了。)
print(query)
是否为每个循环打印不同的查询?另请参见:否,
print(query)
将是
我的sql查询在这里,id=0
,遵循bereal的建议,将查询移动到循环中,修复了它,我可以根据发布的链接标记了解原因(抱歉,搜索此链接时忽略了该问题,但现在它确实有意义)。