Python:全局变量与前缀为“的变量之间有什么区别;“自我”;,与局部变量相比?
多年来,我接触过类似C/C++/Java的语法,Python变量的定义方式让我有些困惑。在C++和java中,有谁能描述Q三中提到的这两个不同之处吗?您可以获得一个对象的引用,然后使用Python:全局变量与前缀为“的变量之间有什么区别;“自我”;,与局部变量相比?,python,variables,Python,Variables,多年来,我接触过类似C/C++/Java的语法,Python变量的定义方式让我有些困惑。在C++和java中,有谁能描述Q三中提到的这两个不同之处吗?您可以获得一个对象的引用,然后使用操作符(->在C++中)访问该对象 在Python中,访问实例变量的唯一方法是显式地通过self。实例变量与局部或全局变量不在同一个“正常”范围内。全局变量就是这样一个变量——一个可以全局访问的变量。局部变量是当前作用域只能访问的变量,例如单个函数定义中使用的临时变量。实例变量(例如:使用self.前缀时)是与对象
操作符(->
在C++中)访问该对象
在Python中,访问实例变量的唯一方法是显式地通过
self
。实例变量与局部或全局变量不在同一个“正常”范围内。全局变量就是这样一个变量——一个可以全局访问的变量。局部变量是当前作用域只能访问的变量,例如单个函数定义中使用的临时变量。实例变量(例如:使用self.
前缀时)是与对象的特定实例关联的数据。当然,您也可以使用object.x
引用对象外部的实例对象,其中object
是对该对象的引用
如果变量的前缀为self
,则它既不是局部变量,也不是全局变量。它是对象特定实例的组成部分。粗略地说,实例变量表示特定对象的属性
在下面的示例中,lx
是一个局部变量,是方法greet
的局部变量gx
是一个全局变量,可在模块中的任何位置访问,ix
是一个实例变量,可以为对象的每个实例提供唯一的值。在对象定义内部引用时,您将引用前缀为self
的ix
,在对象外部引用前缀为对象引用
gx = "hello"
class Foo:
def __init__(self, who):
self.ix = who
def greet(self):
lx = "%s, %s" % (gx, self.ix)
return lx
foo = Foo("world")
print foo.greet()
print foo.ix
有时,回到第一原则是非常有用的: 当我们谈论一个局部或全局变量时,我们指的是它的“范围”(或上下文)。函数中的变量被视为函数的局部变量。以下是施华洛普优秀指南中的插图: 输出: x是50 将本地x更改为2 x仍然是50岁 下面是一个全局变量如何在函数内部和外部之间遍历上下文的示例:
x = 50
def func():
global x
print('x is', x)
x = 2
print('Changed global x to', x)
func()
print('Value of x is', x)
输出:
x是50
将全局x更改为2
x的值是2
这就是全部
当我们利用Python的面向对象编程方面时,“self”的概念就变得相关了。类实例和实例被视为“对象”,而“self.”前缀允许我们的代码区分是引用局部/全局变量还是引用对象的属性
首先,我们再次用禅宗般的简单性解释了这个概念。。Python变量没有“定义”。这可能是你最大的问题。你对“全球”和“本地”有严重的困惑吗?这似乎不太可能。例如,你能写下你认为你知道的具体问题吗?如果你能提供让你困惑的细节,这会有所帮助。代码示例有助于您列出代码中令人困惑的具体内容。我主要困惑的是“自我”是如何进入全局与局部领域的……创建变量的术语是“创建”。赋值语句创建了一个变量。变量的创建不意味着它也被定义了吗?根据:“如果一个变量没有被“定义”(赋值),尝试使用它会给你一个错误”嘿,这是不是意味着你根本不能用局部/全局来描述实例变量,或者它们可以是局部变量,也可以是全局变量,具体取决于上下文…?@kaitlynmcordie:在python中,如果您执行
a=10
,则始终会设置一个名为a
的局部变量。在C++中,根据声明< > > < < />代码>,可以设置本地变量或实例变量。在Python中获取/设置intance变量的唯一方法是通过self:self.a=10
我仍然感到困惑,因为“instance”变量的名称似乎相互矛盾。。。如果一个实例变量在该特定类的*all*运行时实例化中被更新,而至少有一个实例化对其进行了修改,那么将其称为“实例独立”变量不是更合适吗?或者为什么不直接称之为静态变量,因为它看起来基本上就是这样的…@kaitlynmordie:“实例变量”是一个定义良好的术语——它应该指属于单个对象的数据(与所有对象共享的全局或类/静态变量相反)。请注意,self
本身不是全局变量。在C++中,它被魔法地作用于当前对象,在Python中,它是一个基本上具有相同用途的函数参数。@ MISSIONNO:<代码> A=10 不总是给你一个局部变量。考虑一下您以前定义的代码<代码> < /COD>作为全局的例子。
x = 50
def func():
global x
print('x is', x)
x = 2
print('Changed global x to', x)
func()
print('Value of x is', x)