001、【疑问,已解答】__init__ ( x=andom.randint(-20, 20) ) ) 默认参数值 ,构建的对象,值都一样 ??
请先看代码和执行结果,再解答疑问。
疑问:为什么 三个坐标都是 : -9 ,-8 ? 我原以为是随机生成3个不同点的坐标 。
答案: 默认参数的值只在函数定义的时候计算一次,而且这里的值是整型,为不可变对象,所以不管实例(不传参实例)多少次,这里x,y值都一样
异常代码如下:
import random
class Point:
# 初始化方法,如果没有传参,默认随机生成一个 point 对象
def __init__(self, x=random.randint(-20, 20), y=random.randint(-20, 20)):
print(x, y)
self.x = x
self.y = y
# 显示坐标点
def show_point(self):
print(f'点的坐标为:x={self.x} , y={self.y}\n')
p1 = Point()
print(id(p1))
p1.show_point()
p2 = Point()
print(id(p2))
p2.show_point()
p3 = Point()
print(id(p3))
p3.show_point()
执行结果如下:
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day09\venv\Scripts\python.exe D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day09/test_05/test_02.py
-9 -8
2107928358624
点的坐标为:x=-9 , y=-8
-9 -8
2107927254592
点的坐标为:x=-9 , y=-8
-9 -8
2107928826208
点的坐标为:x=-9 , y=-8
Process finished with exit code 0
代码改成如下:
import random
# 定义一个 坐标点 类
class Point:
# 初始化方法,如果没有传参,默认随机生成一个 point 对象
def __init__(self, x=None, y=None):
if x is None:
self.x = random.randint(-20, 20)
else:
self.x = x
if y is None:
self.y = random.randint(-20, 20)
else:
self.y = y
# 显示坐标点
def show_point(self):
print(f'点的坐标为:x={self.x} , y={self.y}\n')
p1 = Point(x=1)
print(id(p1))
p1.show_point()
p2 = Point(y=2)
print(id(p2))
p2.show_point()
p3 = Point(x=3, y=4)
print(id(p3))
p3.show_point()
p4 = Point()
print(id(p4))
p4.show_point()
执行结果如下:
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day09\venv\Scripts\python.exe D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day09/test_05/test_02.py 2353881161440 点的坐标为:x=1 , y=-11 2353880204288 点的坐标为:x=-9 , y=2 2353880061504 点的坐标为:x=3 , y=4 2353881634368 点的坐标为:x=15 , y=-15 Process finished with exit code 0