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

 

posted @ 2021-08-19 13:01  空-山-新-雨  阅读(52)  评论(0编辑  收藏  举报