前言
关键字:python、函数默认值、init函数默认值
一、python 函数的默认值
python函数的默认值是在“编译期”就已经确定了,后续无论怎么改变,函数的参数的默认值都不会变化。
比如f(x=start_x,y=start_y),最开始的start_x和start_y的值就确定了f函数x,y的默认值,后续无论怎么改变start_x和start_y的值,函数的参数x,y的默认值都不会变化。
具体见如下代码分析
二、代码分析
1.init函数
import math
class Point:
start_point_x = start_point_y = 8848
def __init__(self, x=start_point_x, y=start_point_y):
self.x = x
self.y = y
def change_start_point(self, x, y):
Point.start_point_x = x
Point.start_point_y = y
point1 = Point(5, 0)
print(point1.x, point1.y) # 5 0
print(Point.start_point_x, Point.start_point_y) # 8848 8848
#更改类变量start_point_x和start_point_y的值为1
point1.change_start_point(1, 1)
point2 = Point()
print(point2.x, point2.y) # 8848 8848
print(Point.start_point_x, Point.start_point_y) # 1 1
#更改类变量start_point_x和start_point_y的值为2
point2.change_start_point(2, 2)
point3 = Point()
print(point3.x, point3.y) # 8848 8848
print(Point.start_point_x, Point.start_point_y) #2 2
2.分析说明
point1.change_start_point(1, 1)
point2.change_start_point(2, 2)
这两行代码更改了类属性:start_point_x, start_point_y
之后采用空参创建对象时 new_point=Point() 会调用如下代码:
def __init__(self, x=start_point_x, y=start_point_y):
self.x = x
self.y = y
但是输出时发现新new_point的x,y的值都还是之前的8848,不是更改后的1或2.
这是由于python函数的一个坑,如果函数的参数带有默认参数,那么它在“编译时”就确定了值,之后无论怎么改变,形参的默认值都是最初的。
总结
python中,如果函数的参数带有默认参数,那么它在“编译时”就确定了值,之后无论怎么改变,形参的默认值都是最初的。