python 的五种赋值方式
NB(注意): #
后面的部分表示输出结果。
第一种:类似于其他语言的中规中矩的赋值方式,代码如下:
class Debug:
def __init__(self):
self.x1 = 5
self.x2 = 6
def printNum(self):
print(f"the value of x1 is: {self.x1}") # the value of x1 is: 5
print(f"the value of x2 is: {self.x2}") # the value of x2 is: 6
if __name__ == "__main__":
main = Debug()
main.printNum()
最常见的一种赋值方式,每个变量占据一行进行赋值。
第二种:赋值语句在一行分开完成,代码如下:
class Debug:
def __init__(self):
self.x1 = 5; self.x2 = 6
def printNum(self):
print(f"the value of x1 is: {self.x1}") # the value of x1 is: 5
print(f"the value of x2 is: {self.x2}") # the value of x2 is: 6
if __name__ == "__main__":
main = Debug()
main.printNum()
可以看到此时我们将两个赋值语句放置在同一行,并用分号隔开,此时也可以成功完成赋值,分号类似于C#
语言中结尾的分号的作用,告诉程序当前行执行完毕。
第三种是:赋值语句在一行合并完成,专业术语叫做序列解包 ,代码如下:
class Debug:
def __init__(self):
self.x1, self.x2 = 5, 6
def printNum(self):
print(f"the value of x1 is: {self.x1}") # the value of x1 is: 5
print(f"the value of x2 is: {self.x2}") # the value of x2 is: 6
if __name__ == "__main__":
main = Debug()
main.printNum()
我们将多个变量名用逗号隔开放在左侧,使用一个赋值号,并将对应想要给与的值放在右侧的相应位置,也用逗号隔开即可,从结果可以看到我们也成功完成了赋值。当要给多个变量赋值的时候推荐使用这种形式。
第四种:当两个变量值相等的时候可以连等赋值,专业术语叫做链式赋值。代码如下:
class Debug:
def __init__(self):
self.x1 = self.x2 = 5
def printNum(self):
print(f"the value of x1 is: {self.x1}") # the value of x1 is: 5
print(f"the value of x2 is: {self.x2}") # the value of x2 is: 5
print(id(self.x1)) # 140703956215952
print(id(self.x2)) # 140703956215952
self.x1 = 7
print(f"the value of x1 is: {self.x1}") # the value of x1 is: 7
print(f"the value of x2 is: {self.x2}") # the value of x2 is: 5
print(id(self.x1)) # 140703956216016
print(id(self.x2)) # 140703956215952
if __name__ == "__main__":
main = Debug()
main.printNum()
然而上述的赋值方法存在隐患,先说明一下id()函数的作用:
id(): 函数返回对象的标识。 这是给定对象唯一的整数,并且在其生存期内保持不变。
我们可以看到当我们完成链式赋值时,此时变量self.x1
与self.x2
的标识是一样的,可以理解为都是张三这个人,一个是他的小名,一个是他的大名,但是都是一个人,因此当我们改变变量self.x1
的值时,理论上self.x2
的值也是会改变的,因为我们将张三换成了李四,然而这里我们打印发现,仅仅self.x1
的值发生了变化,它的标识也从140703956215952
变为了140703956216016
,而self.x2
的值并未发生变换,并且它的标识还是原来的值,这是因为编译器自身对这个赋值进行了调整。
根据我的使用经验,当使用Anaconda编译器时,这个变量重新赋值的过程会被修正,改变一个变量的值是不会改变另一个变量的值的,但是Pycharm编译器中,改变一个变量的值是会改变另一个变量的值的。所以在使用链式赋值并且后面要对变量进行重新赋值时,要根据不同编译器的不同情况采取不同的措施,我估计python
自带shell
中的情况应该类似于Pycharm
(没有尝试过)。
第五种:增强赋值,个人觉得这个只是个噱头,一个概念而已,我们会经常用到,只不过会很少注意到。代码如下:
class Debug:
def __init__(self):
self.x1 = 5
self.x1 += 2
def printNum(self):
print(f"the value of x1 is: {self.x1}") # the value of x1 is: 7
if __name__ == "__main__":
main = Debug()
main.printNum()
上述代码中的 self.x1 += 2
的专业术语就是增强赋值,其本身为 self.x1 = self,x1 + 2
。
上一篇: 请看在狗的面子上一定要罚
下一篇: 不好,上头了