据我所知,如果你遍历列表并更新其元素,你就不会更新列表本身。
list_var = ['a','b','c']
for l in list_var:
l = 'x'
print list_var
它打印出['a','b','c'],而不是X的
下面的代码属于我的一个项目。
if hasattr(self.model, 'get_disabled_always_fields'):
for field in self.model.get_disabled_always_fields():
for form in self.formset_instance:
try:
form.fields[field].widget.attrs['readonly'] = True
except KeyError as e:
pass
它更新了list元素,它影响了我们迭代的列表。
问题是,为什么formset表单受到for循环修改的影响。
答案 0 :(得分:1)
a = 1
实际上只是意味着“使a
为表达式1
所携带的值的别名”。 a = 1 + 2
实际上只是意味着“评估1 + 2
然后为a
创建结果的别名。
但是,a[0] = 1
表示“将a
的第一个值设置为表达式1
”。
因此,如果您循环遍历列表,那么您实际上是遍历iterable中的每个值,并且对于每个值,您将form
设置为该值。在列表中执行form = a
只会更改form
的含义。执行form[0] = a
会修改form
。
如果您不想修改它,请考虑使用form = form[:]
在循环开始时克隆表单。
我希望在这种情况下变量如何工作的概念现在已经很清楚了;它可能有点令人困惑!
答案 1 :(得分:0)
在第一个示例中,您将list_var
的元素分配给l
,然后重新分配相同的l
变量。
在第二个示例中,您使用的是form.fields[field].widget.attrs['readonly']
而不是field
(您通过其进行迭代)。所以如果你要这样做:
for field in self.model.get_disabled_always_fields():
for form in self.formset_instance:
field = 'something' # or
form = 'something2'
在第一个例子中没有什么会改变。