- Python是动态类型:同一个变量名,可以先后存放不同类型的数据,类型由赋值的值决定。
fridge = "这是冰箱" # fridge 是字符串
fridge = {"apples":3,"oranges":4,"milk":2} # fridge 变成字典Code language: PHP (php)
- 局部作用域 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的罐子;
函数里面自己新建了一个同名罐子;
函数只操作自己内部的罐子,不会碰外面那一个。
注意
- 函数内部赋值 → 创建局部变量,不修改全局
- 如果只是读取全局变量,不赋值,函数可以读到外面全局的值。
val = 100
def read_val():
print(val) # 只读,可以读取全局变量
read_val()Code language: PHP (php)
- 如果想要在函数内修改全局变量,需要用
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)
Previous: 函数 docstring
Next: 注释