Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:全局变量与前缀为“的变量之间有什么区别;“自我”;,与局部变量相比?_Python_Variables - Fatal编程技术网

Python:全局变量与前缀为“的变量之间有什么区别;“自我”;,与局部变量相比?

Python:全局变量与前缀为“的变量之间有什么区别;“自我”;,与局部变量相比?,python,variables,Python,Variables,多年来,我接触过类似C/C++/Java的语法,Python变量的定义方式让我有些困惑。在C++和java中,有谁能描述Q三中提到的这两个不同之处吗?您可以获得一个对象的引用,然后使用操作符(->在C++中)访问该对象 在Python中,访问实例变量的唯一方法是显式地通过self。实例变量与局部或全局变量不在同一个“正常”范围内。全局变量就是这样一个变量——一个可以全局访问的变量。局部变量是当前作用域只能访问的变量,例如单个函数定义中使用的临时变量。实例变量(例如:使用self.前缀时)是与对象

多年来,我接触过类似C/C++/Java的语法,Python变量的定义方式让我有些困惑。在C++和java中,有谁能描述Q三中提到的这两个不同之处吗?您可以获得一个对象的引用,然后使用
操作符(
->
在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)