在mac x上的python 2.7.5中,我可以写以下几行。我的问题是,变量age1是在内部块中声明的,因此不应该在后续的外部块中可见。但是python编译并且不抱怨。如果我注释行age1 = 25,那么python就会抱怨变量age1没有被声明。
在其他语言(如java/c++ )中,在作用域内声明的变量(由{}确定)在作用域外不可见。因此,我的问题是,在python中,由缩进决定范围的目的是什么。
age = 41
if age >= 41:
print(">=41")
age1 = 25 #this is declared inside the scop
我目前正在尝试理解python中的这段代码。
def foo(a):
if a==12:
var = "Same"
else:
var = "different"
我阅读并理解了python不支持基于块的作用域这一事实。因此,函数中创建的所有东西(无论是在循环中还是条件语句中)都是函数的其他成员可以公开使用的,我还阅读了作用域规则。在这一点上,假设这些内部作用域变量是在函数中悬挂的,就像它们在javascript中被挂起一样吗?
我一直在同时学习Ruby和Python,我注意到的一件事是,这两种语言似乎对待作用域的方式不同。下面是我的意思的一个例子:
# Python
a = 5
def myfunc():
print a
myfunc() # => Successfully prints 5
# Ruby
a = 5
def myfunc
puts a
end
myfunc # => Throws a "NameError: undefined local variable or method `a' for main:Object"
在Python中,def块似乎可
我对作用域在Ruby中的工作原理有点困惑。哪些Ruby作用域规则阻止下面的代码打印出x的值?
#!/usr/bin/ruby
x = 5
def test
puts "x = #{x}"
end
test # => undefined local variable or method `x' for main:Object
等效的Python脚本会打印x的值:
#!/usr/bin/python
x = 5
def test():
print "x = %s" % x
test() # => x = 5
我写了一个简单的函数来理解Python中的局部和全局作用域。
x = 50
def func(x):
print('x is', x)
x = 2
print('Changed local x to', x)
func(x)
print('x is still', x)
这里我想要了解的是,在x= 2赋值的过程中,函数内部,是否有新的变量被创建,因为全局变量x仍然保持值50。这个过程在Python中是如何发生的?
我在Python中使用了以下函数,该函数似乎正在运行:
def test(self):
x = -1
# why don't I need to initialize y = 0 here?
if (x < 0):
y = 23
return y
但是为了让它工作,为什么我不需要初始化变量y呢?我以为Python有块作用域,这怎么可能呢?
我写了这段代码:
x = 0
def counter():
x = 1
def temp(self):
print x
x += 1
return temp
尝试测试python是词法作用域还是动态作用域。我的想法是
y = counter()
y()
应该输出0或1,这将告诉我python的作用域是如何确定的。但是,调用y会抛出一个异常,说明x是未定义的。在我对Python工作原理的理解中,似乎有一些根本性的缺陷。
有人能解释一下这是怎么回事吗?是的,我知道使用对象可以很容易地做到这一点。我试图探索在不使用对象的情况下为函数提供状态的想法。我这样写代码是因为上面翻译成像Sche
在Python中,if语句中的变量作用域在if语句之外可见吗?(来自Java背景,所以觉得这有点奇怪)
在下面的例子中,name首先在if-block内定义,但是变量在if-block之外也是可见的。我预计会出现一个错误,但是'joe‘被打印出来。
if 1==1:
name = 'joe'
print(name)
我一直在尝试用Python语言查找。资源分配即初始化是C++中的一种模式,通过该模式,对象在创建时即被初始化。如果失败,则抛出异常。这样,程序员就知道对象永远不会处于半构造状态。Python可以做到这一点。
但是RAII也使用C++的作用域规则来确保对象的迅速销毁。一旦变量弹出堆栈,它就会被销毁。这在Python中可能会发生,但只有在没有外部或循环引用的情况下才会发生。
更重要的是,对象的名称仍然存在,直到它所在的函数退出(有时会更长)。模块级的变量将在模块的生命周期内一直存在。
如果我这样做,我可能会得到一个错误:
for x in some_list:
...
... 100 l
我猜以下两种代码的不同之处。第一个是在python中,并且只工作fine.Here,它是:
>>> def foo():
if 1:
print "this is working"
n=6
print "the value of n is {0}".format(n)
>>> foo()
this is working
the value of n is 6
第二个是c语言,我想实现这两个程序的方式是same.Here --它是:
void
我注意到一些语言,如C、C++、Java、Perl和.NET Visual都有“块”作用域,这意味着变量将只定义在它所声明的特定代码块中。
例如,
(C++):
if (true) {
int x = 1;
}
std::cout << x << std::endl;
此代码将无法编译,因为x仅在if语句创建的块作用域中可见。
错误:“X”未在此范围内声明
但是,像VBA、Python和Javascript这样的语言都有“基于函数”的作用域,这意味着创建新范围的唯一时间是定义新函数时。
例如,
(VBA):
If True Then
Dim x As
假设我有以下python代码:
def outer():
string = ""
def inner():
string = "String was changed by a nested function!"
inner()
return string
我想调用outer()来返回"String was changed by a nested function!",但我得到的是"“。我的结论是,Python认为string = "string was changed by a ne
我目前正在用Python开发一些东西,我有一个关于变量作用域的问题。
代码如下:
a = None
anything = False
if anything:
a = 1
else:
a = 2
print a # prints 2
如果我删除第一行(a = None),代码仍然可以像以前一样工作。然而,在本例中,我将在"if“块中声明变量,而对于其他语言,如Java,该变量将只在"if”中可见。
在Python中变量作用域到底是如何工作的,在这种情况下编程的好方法是什么?
谢谢!
我看到在作用域内定义变量是可能的,但是在该作用域之外引用它。例如,下面的代码可以工作:
if condition:
x = 5
else:
x = 10
print x
然而,这让我觉得有点奇怪。如果您尝试在C中执行此操作,变量X的作用域将不正确:
if(condition) { int x = 5; }
else { int x = 10; }
print x; // Doesn't work: x is unavailable!
无论如何,在C中的解决方案是首先声明X,然后弄清楚如何处理它:
int x;
if(condition) { x = 5; }
else
在下面的python示例中,方法和属性似乎超出了范围,但它们仍然有效,这是怎么回事?
for module in output:
a = 1
attributes=[]
methods=[]
for branch in module[2]:
for leaf in branch[2]:
if leaf[0]=="method":
methods.append(leaf[1])
if leaf[0]=="attribute":
所以当我开始面对这个问题时,我正在写一些条件句。谁能给我解释一下为什么这段代码不能执行?(我简化了语义,使其更容易重现)
a = 1
b = 2
def run():
if a < b:
a = b
run()
它会引发一个UnboundLocalError: local variable 'a' referenced before assignment。这似乎发生在if块中赋值的变量,所以我将函数更改为:
def run():
if a < b:
b = a
然后消息是UnboundLocalError: local variable
我正在设计一种具有Pythonesque语法的语言,包括通过赋值随意创建变量。目前,我想知道如何处理全局变量的赋值(以及对象/类变量,因为我将类实现为作用域)。在Python本身中,默认情况下,尝试将创建一个局部变量:
x = 1
def f():
x = 2 # creates a local variable
但是,您可以通过global声明覆盖这一点:
x = 1
def f():
global x
x = 2 # updates the global variable
我将实现一个前缀.,用于引用外部作用域中的变量(类似于C++中的前缀::,但可能会跳过一个作用
这需要我更深入地研究Python源代码,但由于已经有很多人这样做了,我很想听听他们的意见。
>>> import os
>>> def scope():
... print os
... import os
...
>>> scope()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in scope
Un
在Python3.7参考手册的中,我阅读了以下语句:
global语句与同一块中的名称绑定操作具有相同的作用域。如果一个空闲变量最近的包围作用域包含一个global语句,则该空闲变量将被视为全局变量。
因此,我在Python解释器中输入了以下代码:
x =0
def func1():
global x
def func2():
x = 1
func2()
在调用func1()之后,我希望x在全局范围中的值将更改为1。
我做错什么了?
我认为我根本不理解Python是如何做变量、作用域和名称解析之类的事情的。特别值得一提的是,下面的函数broken()不起作用,这真的让我很惊讶。而且,虽然我已经在网络上搜寻了一段时间,寻找一个有用的解释,但我仍然不明白。有没有人可以解释或链接到Python语言中这个东西是如何工作的,并且有足够的细节,在阅读相关材料后,为什么broken()不能工作似乎是显而易见的?
# Why does this code work fine
def okay0():
def foo():
L = []
def bar():
L.append(
我正在尝试执行一些Python3源代码中的作用域分析,并且我被非本地语句在类定义中的工作方式所困扰。
据我所知,类定义在一个新的命名空间中执行它的主体(称为dict),并将类名绑定到type( name,base,dict)的结果。只要非局部x引用的变量被绑定在封闭的非局部作用域中的某处,它就应该起作用。
因此,我希望编译并运行以下代码:
class A:
v = 1
class B:
nonlocal v
v = 2
但这失败了,因为
SyntaxError: no binding for nonlocal 'v' found
在python中,我知道查找局部作用域变量比查找全局作用域变量要快得多。所以:
a = 4
def function()
for x in range(10000):
<do something with 'a'>
比
def function()
a = 4
for x in range(10000):
<do something with 'a'>
因此,当我查看具有属性和方法的类定义时:
class Classy(object):
def __init__(self,
如果函数需要修改在全局作用域中声明的变量,则需要使用全局声明。但是,如果函数只需要读取全局变量,则无需使用全局声明即可实现:
X = 10
def foo():
global X
X = 20 # Needs global declaration
def bar():
print( X ) # Does not need global
我的问题是关于Python的设计:为什么Python的设计允许在不使用全局声明的情况下读取全局变量?也就是说,为什么只强制赋值具有全局,为什么不也强制全局读取?(这将使它变得均匀而优雅。)
注意:我可以看到在读取时没有歧义,但赋值时不清楚
> var v = Math.random() // var means local variable
> v
0.012659968143515665
> w = Math.random()
0.055781313840123414
变量v和w之间的关键区别是什么?作用域?换句话说,什么时候应该使用局部变量,什么时候不应该使用?
我的重点是MongoDB交互式shell环境,以及它在Python中的用法。
python可以在局部作用域中声明全局变量吗?
它是有效的:
def main():
# do some... for files varible
for file in files:
result = func(file)
print result
我不明白。谁来告诉我为什么可以在for循环之外看到result。
谢谢你。
我刚接触Python,所以这可能是一个简单的作用域问题。Python文件(模块)中的以下代码让我有点困惑:
if __name__ == '__main__':
x = 1
print x
在我使用过的其他语言中,此代码会抛出异常,因为x变量是if语句的本地变量,不应该存在于该语句之外。但这段代码会执行,并打印1。有人能解释这种行为吗?在一个模块中创建的所有变量都是全局的/对整个模块可用吗?