Python 变量详解

Python中,变量是用于存储数据值的基本容器。与一些其他编程语言不同,Python是一种动态类型语言,这意味着不需要显式声明变量的类型,解释器会根据赋给变量的值自动推断其类型。

1. 变量基础

1.1 变量定义

Python是动态类型语言,变量无需声明类型:

x = 10          # 整数
name = "Alice"  # 字符串
lst = [1, 2, 3] # 列表

1.2 变量命名规则

  • 包含字母、数字和下划线
  • 不能以数字开头
  • 区分大小写
  • 不能是关键字(如if, for等)

2. 变量本质 - 名称绑定

2.1 Python变量的实质

  • Python中的变量实际上是名称到对象的绑定
  • 变量本身没有类型,类型属于对象
  • 示例:
    a = 5    # a绑定到整数对象5
    a = "hi" # 现在a绑定到字符串对象"hi"
    

2.2 引用计数机制

Python使用引用计数跟踪对象引用:

import sys
a = [1, 2, 3]
print(sys.getrefcount(a))  # 查看引用计数

3. 变量作用域

3.1 LEGB规则

Python查找变量的顺序:

  1. Local - 局部作用域
  2. Enclosing - 嵌套函数作用域
  3. Global - 模块全局作用域
  4. Built-in - 内置作用域

3.2 作用域示例

x = 10  # 全局变量

def outer():
    y = 20  # 闭包变量
    
    def inner():
        z = 30  # 局部变量
        print(x, y, z)
    
    inner()

outer()

3.3 global和nonlocal

x = 10

def modify():
    global x
    x = 20  # 修改全局变量

def outer():
    x = 5
    def inner():
        nonlocal x
        x = 7  # 修改闭包变量
    inner()
    print(x)  # 输出7

4. 变量内存管理

4.1 对象标识

a = [1, 2, 3]
b = a
print(id(a) == id(b))  # True,指向同一对象

4.2 浅拷贝与深拷贝

import copy

lst1 = [1, [2, 3]]
lst2 = copy.copy(lst1)    # 浅拷贝
lst3 = copy.deepcopy(lst1) # 深拷贝

5. 高级变量特性

5.1 变量解包

a, b = (1, 2)       # 元组解包
x, *y, z = [1,2,3,4] # 扩展解包
print(y)            # [2, 3]

5.2 变量交换

a, b = b, a  # Python式变量交换

5.3 变量注解(Python 3.6+)

name: str = "Alice"
count: int = 0

6. 特殊变量

6.1 双下划线变量

__name__    # 模块名称
__file__    # 文件路径
__dict__    # 对象属性字典

6.2 单下划线变量

_ = 10       # 通常表示临时变量
from m import _private # 约定为私有

7. 性能优化技巧

7.1 局部变量访问更快

def fast():
    local_len = len
    for i in range(1000):
        local_len(str(i))

7.2 避免不必要的全局变量

# 较差的做法
global_var = [...]

def process():
    global global_var
    ...

# 更好的做法
def process(data):
    ...

8. 底层实现

8.1 PyObject结构

Python中所有变量都是PyObject指针:

typedef struct _object {
    Py_ssize_t ob_refcnt;  // 引用计数
    PyTypeObject *ob_type; // 类型指针
} PyObject;

8.2 变量查找过程

  1. 在locals()字典中查找
  2. 在globals()字典中查找
  3. 在__builtins__中查找

9. 元编程相关

9.1 动态创建变量

for i in range(5):
    globals()[f"var_{i}"] = i*2
print(var_3)  # 6

9.2 变量追踪

import sys

def trace(frame, event, arg):
    if event == 'local':
        print(f"变量访问: {frame.f_locals}")
    return trace

sys.settrace(trace)
x = 10  # 会触发追踪

10. 最佳实践

  1. 使用有意义的变量名
  2. 避免过长的作用域链
  3. 谨慎使用全局变量
  4. 合理使用类型注解
  5. 注意可变对象的副作用

你可能感兴趣的:(python知识简述,python,开发语言)