Python 在函数内部和函数外部定义变量有什么区别

Python 在函数内部和函数外部定义变量有什么区别,python,class,oop,global-variables,Python,Class,Oop,Global Variables,我想学习Python中类的基础知识,但我被卡住了。我声明了类变量和实例变量的相同名称,以便更好地理解它们之间的区别,但当我在类方法中使用类变量时,它会显示类似于NameError的错误:未定义全局名称“a”。如果类变量和实例变量具有相同的名称,有人能告诉我如何在类内外声明类变量吗。下面给出了代码,因此输出中存在错误 class abc: a=10 def __init__(self,a): self.a=a def mod1(self):

我想学习Python中类的基础知识,但我被卡住了。我声明了类变量和实例变量的相同名称,以便更好地理解它们之间的区别,但当我在类方法中使用类变量时,它会显示类似于NameError的错误:未定义全局名称“a”。如果类变量和实例变量具有相同的名称,有人能告诉我如何在类内外声明类变量吗。下面给出了代码,因此输出中存在错误

class abc:
    a=10
    def __init__(self,a):
        self.a=a
    def mod1(self):
        global a
        a=5
        self.a=105
    def mod2(self):
        a=15
        self.a=110
    def read(self):
        print(self.a)
        print(a)

b=abc(20)
print(b.a)
b.read()
b.mod1()
b.read()
b.mod2()
b.read()
错误是

20
20
Traceback (most recent call last):
  File "/Users/rituagrawal/PycharmProjects/untitled2/code/garbage.py", line 18, in <module>
    b.read()
  File "/Users/rituagrawal/PycharmProjects/untitled2/code/garbage.py", line 14, in read
    print(a)
NameError: global name 'a' is not defined

Process finished with exit code 1
20
20
回溯(最近一次呼叫最后一次):
文件“/Users/rituagrawal/PycharmProjects/untitled2/code/garbage.py”,第18行,在
b、 读()
文件“/Users/rituagrawal/PycharmProjects/untitled2/code/garbage.py”,第14行,已读
印刷品(a)
NameError:未定义全局名称“a”
进程已完成,退出代码为1

在类级别设置的属性由类的每个实例共享

\uuuu init\uuuu
或其他方法(例如
self.a=a
)中对实例设置的属性对于每个实例都不同,并且在每个方法中都可用

也可以在方法中设置引用-
a=15
,这些引用仅在方法的范围内<在
read()
方法中,code>print(a)失败,因为该方法中未设置
a

更新

一些代码来说明

class-MyClass:
a=10
定义初始化(self,b):
self.b=b
def读取(自):
c=99
print(self.a)#Class属性-对于MyClass的所有实例都相同
print(self.b)#Instance属性-MyClass的每个实例都有自己的实例,在所有方法中都可用
打印(c)#本地-仅在此方法中可用。

欢迎来到苏丽图·阿格拉瓦尔

self.a 
是一个实例变量,正如您所理解的。如果要引用静态(类)变量a,则应使用:

abc.a
因此:

您还可以使用实例的_类_成员,因此:

class abc:
    a=10
    def __init__(self,a):
        self.a=a
        __class__.a = 40

b=abc(20)
print(b.a)
print(b.__class__.a)

首先,我把你们的课程简化如下。 此处,类变量
a
,使用
abc.a
在类函数中引用。 实例变量
a
使用
self.a

class abc:

    a=5

    def __init__(self,a):
        self.a=a

    def set(self, class_a, instance_a):

        abc.a=class_a
        self.a=instance_a

    def read(self):

        print(abc.a)
        print(self.a)
然后,我们首先定义类并尝试读取这两个变量。类变量仍然是5,实例变量是20

b=abc(20)
b.read()
#5
#20
然后,我设置类和实例变量
a
,并尝试读取它们。类变量更改为30,实例变量更改为60

b.set(30, 60)
b.read()
#30
#60
我们还可以使用
instance\u object.a
作为实例变量和
ClassName.a
作为类变量直接访问类外的两个变量

print(b.a)
#30
print(abc.a)
#60

可能重复的检查我的答案下面,看看它是否有助于你!谢谢,但是解释器不可能在函数Read()中考虑一个AS类变量。我将添加一些代码以使所有这些更清楚。谢谢。我现在知道了,谢谢你的回复。如果我声明abc,你能详细说明“a”中的哪一个正在改变吗?a=40,因为这个程序的输出是20,40,如果我使用abc,我仍然不知道哪个变量正在改变类变量或实例变量。a=40因为abc是类,abc.a=40将类变量改变为40。由于b是一个实例,因此b.a=50将实例变量更改为50。
print(b.a)
#30
print(abc.a)
#60