【发布时间】:2015-08-19 05:01:47
【问题描述】:
我无法理解以下代码的结果发生了什么:
my_str = "outside func"
def func():
my_str = "inside func"
class C():
print(my_str)
print((lambda:my_str)())
my_str = "inside C"
print(my_str)
输出是:
outside func
inside func
inside C
另外一段代码是:
my_str = "not in class"
class C:
my_str = "in the class"
print([my_str for i in (1,2)])
print(list(my_str for i in (1,2)))
输出是:
[‘in the class’, 'in the class’]
['not in class’, 'not in class’]
问题是:
- 每个 print() 语句中发生了什么?
- 谁能解释为什么 print() 语句从不同的命名空间获取字符串?
编辑 1:
我认为这与 this question 不同,因为我谦虚地认为那里的答案并不能解释这种变化:
my_str = "outside func"
def func():
my_str = "inside func"
class C():
print(my_str)
print((lambda:my_str)())
#my_str = "inside C"
print(my_str)
输出是:
inside func
inside func
inside func
编辑 2:
确实,这是 this question 的副本,因为正如 Martijn Pieters 所说:
那里的答案是:如果在类体内分配了一个名称, 几乎在一开始。您分配给 my_str,使其大小写相同 在那里。注释掉该行意味着您不再分配 到 my_str,使其大小写与 x 相同。
【问题讨论】:
-
@MartijnPieters Antti 的精彩回答涵盖了第一种情况。第二种情况是这样的,但它并不是一个完全的骗局。也许我会将那个链接留给未来的访问者来回答这个问题。 (你已经准备好了仪式草案;))
-
@BhargavRao:对不起,我实际上假设您链接到Short Description of Python Scoping Rules!这确实是一个骗局。
标签: python class namespaces global-variables