x = 3 y = x在这个例子中,x 和 y 都是指向整数 3 这个对象的引用。我们可以通过 id() 函数查看它们指向的对象的内存地址,验证这一点。
print(id(x)) # 输出:94832830448320 print(id(y)) # 输出:94832830448320二、可变对象和不可变对象
x = 3 print(id(x)) # 输出:94832830448320 x = 4 print(id(x)) # 输出:94832830448352在这个例子中,我们先是让变量 x 指向了整数 3,然后又让 x 指向了整数 4。我们无法改变整数 3 自身,但是可以改变 x 所指向的对象。
// 堆代码 duidaima.com x = [1, 2, 3] print(id(x)) # 输出:139644486420232 x.append(4) print(id(x)) # 输出:139644486420232 x = [1, 2, 3, 4, 5] print(id(x)) # 输出:139644486437576
在这个例子中,我们先是让变量 x 指向了一个列表 [1, 2, 3],然后我们通过 append() 方法改变了这个列表,使其变为了 [1, 2, 3, 4]。此时,x 所指向的对象并没有改变,但是对象自身发生了变化。然后,我们让 x 指向了一个新的列表 [1, 2, 3, 4, 5]。此时,x 所指向的对象改变了。理解可变对象和不可变对象的区别,对于我们正确理解 Python 变量和函数的行为,以及编写正确、有效的代码都是非常重要的。
def change(n): print(id(n)) n = 1000 print(id(n)) x = 3 print(id(x)) change(x) print(x)在这个例子中,函数 change() 试图改变参数 n。但是因为 n 是一个不可变对象,所以函数内部其实创建了一个新的对象,而原来的对象并没有改变。
def change(n): print(id(n)) n.append(4) x = [1, 2, 3] print(id(x)) change(x) print(x)在这个例子中,函数 change() 改变了参数 n。因为 n 是一个可变对象,所以函数内部的改变影响到了原来的对象。
def change(n): n.append(4) x = [1, 2, 3] change(x[:]) print(x)
在这个例子中,我们传入了 x 的副本,因此函数内部的改变不会影响到 x。总的来说,Python 的函数参数传递机制遵循“传对象引用”的方式,理解这一点,能帮助我们更好的理解 Python 的工作原理,并编写出更有效率和可读性更强的代码。
# 使用lambda定义一个匿名函数 square = lambda x: x**2 print(square(5)) # 输出:25在这个例子中,我们使用 lambda 关键字定义了一个匿名函数,该函数接收一个参数 x 并返回 x 的平方。
# 使用lambda在列表排序中实现自定义排序规则 data = [{'name':'Alan', 'age':20}, {'name':'Lisa', 'age':18}, {'name':'Tom', 'age':22}] data.sort(key=lambda x: x['age']) print(data) # 输出:[{'name': 'Lisa', 'age': 18}, {'name': 'Alan', 'age': 20}, {'name': 'Tom', 'age': 22}]
在这个例子中,我们使用 lambda 函数作为 sort() 函数的 key 参数,来实现根据年龄的排序。
# 使用map()函数将列表中的每个元素平方 nums = [1, 2, 3, 4, 5] squares = map(lambda x: x**2, nums) print(list(squares)) # 输出:[1, 4, 9, 16, 25]在这个例子中,我们使用 map() 函数和一个 lambda 函数,将列表中的每个元素平方。
# 使用filter()函数筛选出列表中的偶数 nums = [1, 2, 3, 4, 5] evens = filter(lambda x: x % 2 == 0, nums) print(list(evens)) # 输出:[2, 4]
在这个例子中,我们使用 filter() 函数和一个 lambda 函数,筛选出列表中的偶数。了解和掌握 Python 函数的这些特性,可以帮助我们编写出更加灵活、有效和简洁的代码。在未来的学习和工作中,我们还将遇到更多关于函数的应用场景,如装饰器、生成器等等,这些都可以看作是 Python 函数特性的延伸和应用。
# 定义一个函数,接受另一个函数作为参数 def apply_func(func, x): return func(x) # 定义一个函数,计算平方 def square(x): return x ** 2 print(apply_func(square, 5)) # 输出:25在这个例子中,apply_func 是一个高阶函数,它接收另一个函数 square 作为参数。
# 定义一个函数,返回另一个函数 def get_func(power): def power_func(x): return x ** power return power_func square = get_func(2) print(square(5)) # 输出:25在这个例子中,get_func 是一个高阶函数,它返回一个新的函数 power_func。高阶函数为我们的代码提供了很大的灵活性。例如,我们可以根据需要动态创建和修改函数,也可以构建更加复杂的函数逻辑。