python入门:变量作用域与内存管理详解
前言
在学习Python编程时,变量的定义与使用是一个基础而重要的概念。本文将详细介绍变量的定义、命名规范、类型、类型转换及作用域等内容。
1. 变量的定义与赋值
遵循先定义后调用的原则
name = "xxx"
sex = "man"
age = "26"
print(name)
2. 变量的命名规范 规则
变量名必须以字母或下划线开头,可以包含字母、数字和下划线,但不能使用Python的保留关键字。
保留关键字表:
# False, None, True, and, as, assert, async, await, break, class, continue, def,
# del, elif, else, except, finally, for, from, global, if, import,
# in, is, lambda, nonlocal,
# not, or, pass, raise, return, try, while, with, yield
3. 变量的常见数据类型
整数(int)、浮点数(float)、字符串(str)、列表(list)、元组(tuple)、字典(dict)、集合(set)等
4. 类型转换
例如 int("123") 将字符串转换为整数,str(123) 将整数转换为字符串。
5. 作用域
局部作用域
局部作用域是指在函数内部定义的变量。它们只能在函数内部访问,不会影响函数外部的变量。
def my_function():
local_var = 10
print(local_var, '局部作用域') # 只能在函数内部访问
my_function()
# print(local_var) 直接访问不到
嵌套作用域
嵌套作用域是指在嵌套函数(函数内部再定义函数)中,内层函数可以访问外层函数的变量。这种作用域也称为非局部作用域(nonlocal scope)。
def outer_function():
outer_var = "I am outside!"
def inner_function():
print(outer_var) # 可以访问外层函数的变量
inner_function()
outer_function()
# 如果要在内层函数中修改外层函数的变量,需要使用 nonlocal 关键字:
def outer_function():
outer_var = "I am outside!"
def inner_function():
nonlocal outer_var
outer_var = "I have been changed!"
print(outer_var)
inner_function()
print(outer_var) # outer_var 的值被修改了
outer_function()
全局作用域
全局作用域是指在模块级别定义的变量,可以在整个模块中访问。如果要在函数内部修改全局变量,需要使用 global 关键字。 global_var = "I am global!"
def my_function():
global global_var
global_var = "I have been changed!"
print(global_var)
my_function()
print(global_var) # global_var 的值被修改了
内置作用域
内置作用域包含了Python内置的函数和变量,这些函数和变量在任何地方都可以访问。例如,print(), len(), int() 等都是内置作用域的变量。
print(len("Hello, World!")) # 内置函数 len
6. 变量的引用与内存管理
变量的引用与内存管理是通过引用计数和垃圾回收机制来实现的。
变量引用机制
-
变量引用:在Python中,变量本质上是对象的引用。当你创建一个变量并赋值时,实际上是在将该变量名绑定到某个对象。
x = 10 # 变量 x 引用整数对象 10 y = x # 变量 y 也引用整数对象 10
引用计数
-
引用计数:Python使用引用计数来跟踪对象的引用数量。每当一个对象被引用一次,其引用计数就加1;当引用被删除或被重新分配时,引用计数减1。
a = [1, 2, 3] # 创建列表对象 [1, 2, 3],引用计数为 1 b = a # 引用计数增加到 2 del a # 引用计数减少到 1
-
自动内存释放:当对象的引用计数变为0时,Python会自动释放该对象占用的内存。
垃圾回收机制
-
垃圾回收:为了处理循环引用(两个或多个对象互相引用,导致引用计数不会归零),Python引入了垃圾回收机制。Python的垃圾回收器会定期检查并清理不再使用的循环引用对象。
import gc gc.collect() # 手动触发垃圾回收
内存管理优化
-
小对象池:Python对小整数和短字符串实现了小对象池机制,以提高性能和减少内存碎片。例如,常用的小整数(通常是 -5 到 256)会被缓存。
x = 5 y = 5 # x 和 y 实际上引用同一个对象
-
内存分配器:Python使用自定义的内存分配器来管理内存分配和释放,以优化性能。
注意
-
避免循环引用:虽然Python有垃圾回收机制,但避免不必要的循环引用可以减少内存使用和垃圾回收的开销。
-
手动管理:在某些情况下,可以使用
gc
模块手动管理和调试内存。import gc gc.disable() # 禁用自动垃圾回收 gc.collect() # 手动触发垃圾回收 gc.enable() # 重新启用自动垃圾回收
Tips:什么是gc?
在Python中,
gc
是指垃圾回收(Garbage Collection)机制,用于自动管理内存,回收不再使用的对象所占用的内存空间。这个机制帮助开发者减少内存泄漏和优化内存使用。Python的垃圾回收主要依赖于引用计数和垃圾回收模块gc
来管理内存。
py代码运行示例(带注释)
import gc
# 1. 变量的定义与赋值
# 先定义 后调用
name = "xxx"
sex = "man"
age = "26"
print(name)
# 2. 变量的命名规范 规则
# 变量名必须以字母或下划线开头,可以包含字母、数字和下划线,但不能使用Python的保留关键字。
# 关键字表
# False, None, True, and, as, assert, async, await, break, class, continue, def,
# del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal,
# not, or, pass, raise, return, try, while, with, yield
# 3. 变量的类型
# 整数(int)、浮点数(float)、字符串(str)、列表(list)、元组(tuple)、字典(dict)、集合(set)等
# 4. 类型转换
# 例如 int("123") 将字符串转换为整数,str(123) 将整数转换为字符串。
# 5. 作用域
# 局部作用域
# 局部作用域是指在函数内部定义的变量。它们只能在函数内部访问,不会影响函数外部的变量。
def my_function():
local_var = 10
print(local_var, '局部作用域') # 只能在函数内部访问
my_function()
# print(local_var) 直接访问不到
# 嵌套作用域
# 嵌套作用域是指在嵌套函数(函数内部再定义函数)中,内层函数可以访问外层函数的变量。这种作用域也称为非局部作用域(nonlocal scope)。
def outer_function():
outer_var = "I am outside!"
def inner_function():
print(outer_var) # 可以访问外层函数的变量
inner_function()
outer_function()
# 如果要在内层函数中修改外层函数的变量,需要使用 nonlocal 关键字:
def outer_function():
outer_var = "I am outside!"
def inner_function():
nonlocal outer_var
outer_var = "I have been changed!"
print(outer_var)
inner_function()
print(outer_var) # outer_var 的值被修改了
outer_function()
# 全局作用域
# 全局作用域是指在模块级别定义的变量,可以在整个模块中访问。如果要在函数内部修改全局变量,需要使用 global 关键字。
global_var = "I am global!"
def my_function():
global global_var
global_var = "I have been changed!"
print(global_var)
my_function()
print(global_var) # global_var 的值被修改了
# 内置作用域
# 内置作用域包含了Python内置的函数和变量,这些函数和变量在任何地方都可以访问。例如,print(), len(), int() 等都是内置作用域的变量。
print(len("Hello, World!")) # 内置函数 len
# 6. 变量的引用与内存管理
# gc.collect() # 手动触发垃圾回收
运行结果
转载自:https://juejin.cn/post/7393663398405472268