【python】代码执行过程、全局变量、局部变量

代码执行过程

【参考:python中函数的定义和调用的先后顺序问题_独孤尚良dugushangliang的博客-CSDN博客

【参考:python main,类变量 - bhz - 博客园

【参考:local variable referenced before assignment 原因及解决办法_斗南花卉市场的博客-CSDN博客

def a(temp):
    print(temp)

def b():
    print(y) # 访问全局变量

def c(): 
    global y # 全局变量 (如果把这句去掉下面会报错,因为【在函数内部试图更改全局变量会导致错误】)
    y+=1 # 函数内没有局部变量x,所以要使用全局变量
    print(y)

def d():
    y=100 # 局部变量
    print(y)


x=1 # 全局变量 全局变量一定是定义在函数外部的
a(x) # 执行 1

# print(y) # 报错

if __name__ == '__main__': # 这个不是函数,这就是给if语句
    
    y=2 # 是全局变量
    #(但前面print(y)无法访问,因为程序从上到下执行,执行print(y)时 全局变量中还没有y )
    a(y) # 执行 2
    b()  # 执行 3
    c()  # 执行 4
    d()  # 执行 5
1
2
2
3
100
  • 代码从上到下依次执行
  • 不要在函数内部改变全局变量的值,如果确实想改变全局变量的值(以y为例),那么需要在函数内部首先声明,即加上global y这一行代码。
  • 当.py文件被直接运行时,if __name__ == '__main__' 之下的代码块将会运行
    当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不会运行

变量

【参考:Python之全局变量、局部变量、类变量、实例变量的解读_叫我王员外就行的博客-CSDN博客

全局变量:模块内、所有函数外、所有class外

局部变量:函数内、class的方法(类方法、静态方法、实例方法)内,且变量前面没有修饰

类变量:class内,不在class的任何方法内

实例变量:class的方法内,使用self修饰

class G():
    fly = False # 类变量(类中的全局变量)
    def __init__(self):
        self.long = 2 # 实例变量
    def run(self):
        r = 4 #局部变量
        print("I am running!.")
        
obj=G() # 实例对象

全局变量与局部变量同名

firstValue = "Hello World" # 全局
 
def print_str():
    firstValue = "hi man" # 局部
    print(firstValue)  # 这里的firstValue调用的是局部变量firstValue,在方法中直接覆盖掉同名的全局变量firstValue

print_str() # hi man

省略global关键字

# global first = 100 
first = 100 # first是全局变量
 
def my_hello():
    print(first) #只是访问(读取)全局变量first的值,无需global修饰(加上global更规范)

my_hello() # 100

不可省略global关键字

name = "王员外"

def change_name():
    global name
    name = name + "非常牛" # 对全局变量name进行操作
    print(name)  
    
change_name() # 王员外非常牛

  • 加上global修饰变量说明:先访问全局变量name的值,然后再相加,最后赋值全局变量,
  • 如果没有global修饰,Python解释器会无法找到name,因为此时Python解释器认为name为局部变量,应该先创建,一般会看到下午的Error,表示未创建局部变量
    UnboundLocalError: local variable ‘name’ referenced before assignment

不可省略global关键字2

my_name = "员外"
 
def baby():
    my_name = "四大才子"
    print(my_name) #注意:此处访问的是局部变量my_name,全局变量my_name并没有改变
 
baby() # 四大才子
print(my_name) # 员外

【参考:关于python类变量和实例变量 - 波波波波波 - 博客园

class Dog():
    size = [] # 类变量
    def __init__(self,name):
        self.name = name  # 实例变量

d1 = Dog("A")
d1.size.append("A")
# 此时 类变量size=['A']
print(d1.size) # ['A']
d2 = Dog("B")
print(d2.size) # ['A']
d2.size.append("B")
# 此时 类变量size=['A', 'B']
print(d1.size) # ['A', 'B']
print(d2.size) # ['A', 'B']
class Dog():
    def __init__(self,name):
        size = [] # 局部变量
        self.name = name
        self.size = size # 实例变量
        
# 在类的构造函数init中,如果定义的变量,是类的局部变量,
# 这个类局部变量,在类实例化对象的时候,会赋值给对象,以后对象对该属性值的修改,不会影响由类创建的其他实例

d1 = Dog("A")
d1.size.append("A")
print(d1.size) # ['A']

d2 = Dog("B")
print(d2.size) # []

d2.size.append("B")

print(d1.size) # ['A']
print(d2.size) # ['B']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值