Python范围规则究竟是什么?
如果我有一些代码:
code1
class Foo:
code2
def spam.....
code3
for code4..:
code5
x()
Run Code Online (Sandbox Code Playgroud)
在哪里x找到?一些可能的选择包括以下列表:
在执行期间,当函数spam在其他地方传递时,也存在上下文.也许lambda函数的传递方式有点不同?
某处必须有简单的参考或算法.对于中级Python程序员来说,这是一个令人困惑的世界.
在Python中,if语句中的变量范围是否在if语句之外可见?(来自Java背景,所以发现这有点奇怪)
在下面的例子中,name首先在if-block中定义,但变量在if-block之外也是可见的.我原以为会发生错误但是'joe'会打印出来.
if 1==1:
name = 'joe'
print(name)
Run Code Online (Sandbox Code Playgroud) 我想知道为什么使用with语句或块中打开的文件对象在退出后仍在范围内.正在<closed file>对象曾经清理?
>>> with open('test.txt','w') as f:
... f.write('test')
...
>>> f
<closed file 'test.txt', mode 'w' at 0x00E014F0>
>>> f.close()
>>> if True:
... fal = open('demo.txt','w')
... fal.write('stuff')
... fal.close()
...
>>> fal
<closed file 'demo.txt', mode 'w' at 0x00E015A0>
Run Code Online (Sandbox Code Playgroud) 我希望它不是重复的(同时很难说,鉴于这些错误的问题数量,但这是基本的错误),但我不明白这里发生了什么.
def f():
c = ord('a')
f()
Run Code Online (Sandbox Code Playgroud)
运行,没有错误(ord将字符转换为ASCII代码,它是内置的).现在:
if False:
ord = None
def f():
c = ord('a')
f()
Run Code Online (Sandbox Code Playgroud)
也运行,没有错误(ord没有被覆盖,条件总是假的).现在:
def f():
if False:
ord = None
c = ord('a')
f()
Run Code Online (Sandbox Code Playgroud)
我得到(在哪里c = ord('a'))
UnboundLocalError: local variable 'ord' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
似乎仅引用左侧操作数使其成为局部变量,即使代码未运行.
显然我可以解决这个问题,但我非常惊讶,因为python的动态方面允许你定义一个变量,就像是一个整数,并在下一行定义为一个字符串.
它似乎与在if语句中初始化的变量的范围有什么关系?
显然,解释器在编译为字节码时仍会记录未到达的分支,但究竟发生了什么?
(在Python 2.7和Python 3.4上测试)
我在 Python 中有以下函数,似乎可以正常工作:
def test(self):
x = -1
# why don't I need to initialize y = 0 here?
if (x < 0):
y = 23
return y
Run Code Online (Sandbox Code Playgroud)
但要使其工作,为什么我不需要初始化变量 y?我以为 Python 具有块作用域,那么这怎么可能呢?
def foo(i):
print len(A)
return i < len(A)
if __name__ == '__main__':
A = [12]
print A
foo(10)
Run Code Online (Sandbox Code Playgroud)
怎么foo知道A?
我写这篇是因为stackoverflow坚持我写了更多的单词.
有人能告诉我在哪里可以找到有关if语句中变量生命周期的一些信息吗?在这段代码中:
if 2 < 3:
a = 3
else:
b = 1
print(a)
Run Code Online (Sandbox Code Playgroud)
它打印变量a。但在我看来,它是if语句的局部变量。在 C infacts 中,如果我a在if语句中创建变量,它会给我一个错误。
我认为这种行为是因为 Python 是一种解释型语言。我对吗?