我只是阅读了以下问题的答案:从类定义中的列表理解访问类变量
它有助于我理解为什么以下代码会导致NameError: name 'x' is not defined
:
class A:
x = 1
data = [0, 1, 2, 3]
new_data = [i + x for i in data]
print(new_data)
NameError
发生这种情况是因为x
未在列表理解的特殊范围内定义。但是我不明白为什么下面的代码可以正常工作。
class A:
x = 1
data = [0, 1, 2, 3]
new_data = [i for i in data]
print(new_data)
我得到了输出[0, 1, 2, 3]
。但是我一直在期待这个错误:NameError: name 'data' is not defined
因为我一直在期待,就像在上一个示例中一样,名称x
没有在列表理解的范围内定义,类似地,名称data
也不会在列表理解的范围内定义。
您能不能帮助我理解为什么x
列表理解范围内没有定义而是data
为什么?
data
是列表理解的 来源 ;它是传递给创建的嵌套作用域的一个参数。
列表理解中的所有内容都在单独的范围内运行(基本上是作为一个函数),除了用于最左侧for
循环的可迭代对象。您可以在字节码中看到这一点:
>>> def foo():
... return [i for i in data]
...
>>> dis.dis(foo)
2 0 LOAD_CONST 1 (<code object <listcomp> at 0x105390390, file "<stdin>", line 2>)
3 LOAD_CONST 2 ('foo.<locals>.<listcomp>')
6 MAKE_FUNCTION 0
9 LOAD_GLOBAL 0 (data)
12 GET_ITER
13 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
16 RETURN_VALUE
的<listcomp>
代码对象被称为像的功能,以及iter(data)
作为参数(在被传递CALL_FUNCTION
与1个位置参数,执行的GET_ITER
结果)。
该<listcomp>
代码对象将查找一个参数:
>>> dis.dis(foo.__code__.co_consts[1])
2 0 BUILD_LIST 0
3 LOAD_FAST 0 (.0)
>> 6 FOR_ITER 12 (to 21)
9 STORE_FAST 1 (i)
12 LOAD_FAST 1 (i)
15 LIST_APPEND 2
18 JUMP_ABSOLUTE 6
>> 21 RETURN_VALUE
该LOAD_FAST
调用引用传入的第一个也是唯一的位置参数。它在这里未命名,因为从未有函数定义为其命名。
列表推导中使用的任何其他名称(或set或dict推导或生成器表达式)都是局部变量,闭包或全局变量,而不是参数。
我有一个关于接口的问题,比如: 现在,我需要这只猫去抓一只老鼠void catchMouse(){std::cout 有几种可能的解决方案,但看起来都不好。 > 在IAnim中添加一个方法,然后使用AnimalFactory创建猫后,我可以从IAnimal调用catchMouse()方法。但是catchMouse并不适用于所有动物,狗不catchMouse。将方法添加到IEM会污染界面,嗅到代码。
这是我的代码,如您所见,我在前面定义了current ,后面int currentCode = encode(current[]);这句话我得到了一个未定义变量的错误;但是中间也有应用到这个变量却没有报错,我不明白这是为什么。
问题内容: 我在编写Traveling Salesman程序时遇到了这个问题。对于内部循环,我尝试了 但是在该列表中添加另一个点时会导致被抛出。 但是,当我将循环更改为 循环运行良好,没有引发异常。 这两个都是for循环,那么为什么一个抛出异常却另一个没有抛出异常呢? 问题答案: 正如其他人解释的那样,迭代器检测到对基础集合的修改,这是一件好事,因为它可能会导致意外的行为。 想象一下下面的无迭代器
有两类: 和 null UPD:这个问题在这里也回答了:静态和非静态字段,因为我不能删除我回答的一个
我知道容器可以有其他参数,如填充或装饰,但如果我不使用这些,为什么我要使用SizedBox而不是容器? 它们之间存在性能差异?