2.3 Python的赋值语句
Python 3的赋值语句比较灵活,有多种语句格式。下面看看这些赋值语句的使用方法。
1.简单赋值
命令格式:
变量名=表达式
变量名的数据类型根据表达式的运算结果而定。
请看示例2-5。
a=10 #变量a的值是整数10 b=10.5+a*2.3 #变量b的值是表达式的计算结果33.5 c=[1,2,4,5] #变量c是一个列表 d=(1,2,3,4,5) #变量d是元组 e=True #变量e是逻辑变量,值为True f=1.5+2.5j #变量f是复数 g='hello Python ! ' #变量g是字符串 print('a= ', a) print('b= ', b) print('c= ', c) print('d= ', d) print('e= ', e) print('f= ', f) print('g= ', g)
程序运行结果略去,读者可自行尝试运行上面代码。
2.多重赋值
多重赋值命令格式如下:
变量名1=变量名2=…=变量名n=表达式
对于基本类型来说,如int,分配独立内存空间赋值给相同值,其中一个变量值变化不会影响其他变量值。
对于对象类型来说,如Pandas的DataFrame类型,所有变量指向一个对象类型空间地址,其中任何一个变量对DataFrame类型进行数据处理,其他变量的数据内容也会变化。这种复制方式叫作浅复制。
例如:
df1=df2 = ts.get_k_data('000001', ktype='D')
df1和df2指向同一个数据,其中任何一个变量数据发生变化,另外一个变量数据也会随之变化,因为它们是同一份数据。
如果想要新建一份数据,就需要用copy()函数,这种复制方式称为深复制。
df3=df1.copy()
此时,df1的数据变化不会影响df3的内容,请看示例2-6。
import HP_global as g import HP_data as hp from HP_sys import * a=b=10.4 #变量a和b的值赋值为 10.4 a=a*3 #变量a的值乘3 print('a= ', a) #显示变量a的值 print('b= ', b) #显示变量b的值,b值没有随a值变化 ds='2017-01-01' #开始日期 de='2017-12-30' #结束日期 stockn='600521' #股票代码,600521华海药业 df=hp.get_k_data(stockn, ktype='D', start=ds, end=de, index=False, autype= 'qfq').head(2) #获取股票数 df2=df3=df #给变量df2和df3浅复制df df4=df.copy() #给变量df4深复制df print('------下面是df2的内容-------------') print(df2) print('------下面是df4的内容-------------') print(df4) df3.open=df3.open*4 #给df3['open']的值放大4倍 print('--下面是浅复制df2的内容,open值放大了4倍-------------') print(df2) print('--可以看到浅复制,df3修改,df2的值也变化了。') print('--下面是深复制df4的内容,深复制open-------------') print(df4) print('-可以看到深复制,df4的值没有变化。') print('-不难想象,修改浅复制的df2或df3,也破坏了原始数据df。') print('------下面是原始数据df的内容-------------') print(df) print('--df与df4比较open,原始数据df也被修改掉了。')
程序运行结果如下:
a= 31.200000000000003 b= 10.4 ------下面是df2的内容------------- date open close high low volume code 0 2017-01-03 18.234 18.234 18.283 18.127 25855.0 600521 1 2017-01-04 18.258 18.193 18.258 18.028 55337.0 600521 ------下面是df4的内容------------- date open close high low volume code 0 2017-01-03 18.234 18.234 18.283 18.127 25855.0 600521 1 2017-01-04 18.258 18.193 18.258 18.028 55337.0 600521 --下面是浅复制df2的内容,open值放大了4倍------------- date open close high low volume code 0 2017-01-03 72.936 18.234 18.283 18.127 25855.0 600521 1 2017-01-04 73.032 18.193 18.258 18.028 55337.0 600521 --可以看到浅复制,df3修改,df2的值也变化了。 --下面是深复制df4的内容,深复制open------------- date open close high low volume code 0 2017-01-03 18.234 18.234 18.283 18.127 25855.0 600521 1 2017-01-04 18.258 18.193 18.258 18.028 55337.0 600521 -可以看到深复制,df4的值没有变化。 -不难想象,修改浅复制的df2或df3,也破坏了原始数据df。 ------下面是原始数据df的内容------------- date open close high low volume code 0 2017-01-03 72.936 18.234 18.283 18.127 25855.0 600521 1 2017-01-04 73.032 18.193 18.258 18.028 55337.0 600521 -df与df4比较open,原始数据df也被修改掉了。
上例演示结果表明,复杂数据类型一定要用深复制,这样才能避免原始数据被误修改。
3.多元赋值
多元赋值是指一条赋值语句实现多个变量的赋值过程。例如,“a, b, c=1,2,3”。多元赋值要求变量名的个数和表达式的个数相等,否则会出现错误。
例如,4个变量仅提供3个表达式“a, b, c, d=1,2,3*5”,就会出现错误信息“ValueError: not enough values to unpack(expected 4, got 3)”。
又如,3个变量提供4个表达式“a, b, c=1,2,3*5,18*2”,也会出现错误信息“ValueError: too many values to unpack(expected 3)”。
多元赋值使程序编写更加简洁、方便,常常被用于函数中,使一个函数返回多个变量值。
请看示例2-7。
a, b, c=1,2,3*5 print('a= ', a) print('b= ', b) print('c= ', c) def xyz(n): x=n*n y=n^2 z=n%2 return x, y, z x, y, z=xyz(6) print('x= ', x) print('y= ', y) print('z= ', z)
程序运行结果:
a= 1 b= 2 c= 15 x= 36 y= 4 z= 0
4.增强赋值
增强赋值是指赋值运算符。
例如,“a*=3”相当于“a=a*3”。
请看示例2-8。
a=5 a+=10 print('a=5, a+=10 , a= ', a) a=35 a-=10 print('a=35, a-=10 , a= ', a) a=35 a*=10 print('a=35, a*=10 , a= ', a) a=35 a/=10 print('a=35, a/=10 , a= ', a) a=35 a%=10 print('a=35, a%=10 , a= ', a)
程序运行结果:
a=5, a+=10 , a= 15 a=35, a-=10 , a= 25 a=35, a*=10 , a= 350 a=35, a/=10 , a= 3.5 a=35, a%=10 , a= 5