Python常见问题解答
1. 函数参数传递是值传递还是引用传递?
Python中的参数传递是"对象引用传递"(或称为"共享对象传递")。具体来说:
- 对于不可变对象(如数字、字符串、元组),传递的是对象的值(表现为类似值传递)
- 对于可变对象(如列表、字典),传递的是对象的引用(表现为类似引用传递)
示例:
def modify(num, lst):num += 1lst.append(4)a = 10
b = [1, 2, 3]
modify(a, b)
print(a) # 输出 10 (不变)
print(b) # 输出 [1, 2, 3, 4] (已修改)
2. 如何避免函数副作用?
函数副作用指的是函数修改了外部状态或变量。避免副作用的方法:
- 使用不可变数据结构:优先使用元组而非列表
- 创建副本:在函数内部操作前创建参数的副本
def process_data(data):data = data.copy() # 创建副本# 处理data...
- 纯函数:函数只依赖于输入参数,不修改外部状态
- 返回新对象:而不是修改输入参数
- 使用函数式编程:如map、filter、reduce等
3. 为什么需要if __name__ == '__main__'
?
这个语句用于判断当前模块是否是直接运行的(而非被导入的)。它的作用:
- 防止模块被导入时自动执行代码:只有直接运行该文件时,
if
块中的代码才会执行 - 模块测试:可以在
if
块中编写测试代码 - 提高代码重用性:既可作为模块导入,也可直接运行
示例:
def some_function():print("This is a function")if __name__ == '__main__':print("This runs when executed directly")some_function() # 测试代码
当该文件被导入时,__name__
会是模块名;当直接运行时,__name__
会是'__main__'
。