我正在从csv文件读取数据。我得到的“行”是代表我正在经历的循环的变量,但是这里扔掉的“ _”是什么?
for row in csv_reader:
_, Student.objects.get_or_create(
first_name=row[0],
last_name=row[1],
email=row[2],
organisation=row[3],
enrolled=row[4],
last_booking=row[5],
credits_total=row[6],
credits_balance=row[7],
)
例如,此代码也适用:
for row in csv_reader:
Student.objects.get_or_create(
first_name=row[0],
last_name=row[1],
email=row[2],
organisation=row[3],
enrolled=row[4],
last_booking=row[5],
credits_total=row[6],
credits_balance=row[7],
)
所以我也可以问,为什么“ _”即使在第一位也出现在这里?
我在另一个问题的答案中找到了这个主意,但没有说明下划线的目的。
更新说明
所以看来,从另一篇文章中复制原始代码时,我犯了一个小错误。原始代码为:
for row in csv_reader:
_, result = Student.objects.get_or_create(...
现在,我看到this answer更有意义。该代码旨在解压缩get_or_create的RESULT并丢弃元组的一个值。我错误地没有将结果变量复制为代码的一部分。
我感觉这里可能会有轻微的语法错误。
get_or_create()
返回一个元组;对象和一个布尔值(如果已创建对象,则为true)。
下划线有时用于该元组中的元素之一(例如bool)
instance, _ = MyObject.objects.get_or_create()
所以_, Student.objects.get_or_create
实际上是有效的python,我只是认为您可能缺少第二个变量来解压缩返回的元组。如果打印类型print(type(_))
,它将返回"tuple"
,如果您输入print(_)
,则应该看到一个包含对象和布尔值的元组。
在_后面加上,
使元组成为_
,这就是为什么它没有给您错误的原因,如果删除,
,它将抛出错误,而如果您执行_,instance
,则将抛出一个错误。错误,因为如果要拆开整个元组,则需要= Student....
。
_
必须在代码块的前面定义,如果该代码没有产生语法错误。它可以一起在循环外部定义,并且可以是带有变量的“范围”问题。
为了给您一个如何使用它的怪异例子,我们可以在另一个循环中使用它,而只是“捕获”该变量而对其不执行任何操作:
d = {1:"A", 2:"B", 3:"C"}
for _, value in d.items():
print(value)
输出:
A
B
C