动态类型

  1. Python是动态类型:同一个变量名,可以先后存放不同类型的数据,类型由赋值的值决定。
fridge = "这是冰箱"       # fridge 是字符串
fridge = {"apples":3,"oranges":4,"milk":2} # fridge 变成字典Code language: PHP (php)
  1. 局部作用域 vs 全局作用域
  • 函数内部定义的变量属于局部变量,只在函数内部生效。
  • 如果函数内变量名字和外部全局变量名字完全一样,它们是两个完全独立的变量
  • 在函数内部给同名变量赋值,只会创建一个新局部变量,不会修改外面的全局变量
  • 不同函数之间,就算变量名相同,互相隔离,互不干扰。

代码

# 全局变量
special_sauce = ['ketchup', 'mayonnaise', 'french dressing']

def make_new_sauce():
    """This function makes a new special sauce all its own"""
    # 这里是函数内部的局部变量,和外面的不是同一个
    special_sauce = ["mustard", "yogurt"]
    return special_sauce


print(special_sauce)
new_sauce = make_new_sauce()

# 全局变量没有被改动
print(special_sauce)
# 返回的是函数内部局部变量的值
print(new_sauce)Code language: PHP (php)

运行输出:

['ketchup', 'mayonnaise', 'french dressing']
['ketchup', 'mayonnaise', 'french dressing']
['mustard', 'yogurt']Code language: JSON / JSON with Comments (json)

通俗理解

外面有个叫 special_sauce 的罐子;
函数里面自己新建了一个同名罐子;
函数只操作自己内部的罐子,不会碰外面那一个。

注意

  1. 函数内部赋值 → 创建局部变量,不修改全局
  2. 如果只是读取全局变量,不赋值,函数可以读到外面全局的值。
val = 100
def read_val():
    print(val) # 只读,可以读取全局变量

read_val()Code language: PHP (php)
  1. 如果想要在函数内修改全局变量,需要用 global 关键字(实际开发不推荐频繁使用global)
val = 100
def modify_val():
    global val
    val = 999

modify_val()
print(val)Code language: PHP (php)

总结

  • 变量名字相同,所处位置(作用域)不同,就是两个不同变量
  • 函数内部赋值,默认只会创建局部变量,不会影响外部。
  • 不同函数之间变量互相隔离,写函数时不用担心变量名和别处冲突。
data = [1,2,3]
def change_data():
    data.append(99) # 没有data=xxx赋值,直接修改对象内容,会改动全局列表

change_data()
print(data)Code language: PHP (php)

Next:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注