赋值语句其实在例子中经常使用,其中包括对变量和一些数据结构的元素进行赋值;但是赋值方法不止这些,还有如序列解包、链式赋值和增量赋值等方法,那么python如何赋值呢?一起来了解下吧:
python如何赋值
python的赋值,尤其是涉及到两个变量时候二者之间有某种计算关系的时候,可以省去临时变量。
比如C语言中的一段:
temp=n
n=n+m
m=temp
就可以在python中简单写作:
m,n=n,n+m
Python如何*最小赋值
码代码时,有时候需要根据比较大小分别赋值:
import random
seq = [random.randint(0, 1000) for _ in range(100)]
#方法1:
xmax, xmin = max(seq), min(seq)
#方法2:
xmax, *_, xmin = sorted(seq)
从上面这个来看,看不出来方法2的优势来,不过我们常用的是比较两个数的大小,并选取:
dx, dy = random.sample(seq, 2)
#方法1:
dx, dy = min(dx, dy), max(dx, dy)
#方法2:
dx, dy = sorted((dx, dy))
Python如何选择赋值
两个对象做比较有两种方式,分别是:is与 == ,is比较的是两个对象是否相同,通过对象的ID值可识别是否为相同对象,==比较的是两个对象的值是否相等。
x1 = [1,2,1]
x2 = [1,2,1]
print(x1 is x2)
print(x1 == x2)
print(id(x1))
print(id(x2))
False
True
2004573077256
2004573077448
上面我们对x1和x2进行赋值,相对于给两个变量分别取了名字x1和x2,两个名字虽然都是列表[1,2,1],但在内存中是两个独立的不同的对象,占据不同的内存空间,就好比两个名字一样的人,实则为两个不同的人。
x3 = x2
print(x2 is x3)
True
上面我们将x2对应的对象绑定了一个新的名字叫x3,这就好比一个人,开始给他取了一个x2的大名,后来又给他取了一个x3的小名,本质上还是同一个人,所以,x2和x3所指的其实是同一个对象。
通过x2修改对象时,x3也会跟着变化,因为本质上它们是同一个对象,这就好比一个人大名x2,小名x3,x2长了一岁相对于x3也长了一岁。
x2.append(2)
print(x2)
print(x3)
[1, 2, 1, 2]
[1, 2, 1, 2]
但是,当我们给x2重新赋值时,相当于x2不再引用之前的对象,而引用新对象,x3依然引用之前的对象。好比一个人的大名x2和小名x3,给x2重新赋值就相当于给另外一个人取大名x2,但是x3还是开始那个人的小名。
x2 = [3,4,3]
print(x2)
print(x3)
[3, 4, 3]
[1, 2, 1, 2]
python的赋值和赋址
python的数字和字符串的值是不变的(元祖也是不可变的),所以当一个变量(数字或字符串)进行值改变的操作时,其实是新开辟了一个地址来存放这个新值。
例如:
>>>a=2
>>>b=a
>>>a=3
>>>b
当执行a=3时,其实是新开辟了一块内存空间来存放3,并且把索引a从2那边解除,指向了存放3的内存地址。所以
a的值是3,但是b还是2。因为b依旧指向2所在的内存空间。
再来看看其他非数字和字符串的操作,例如列表,
>>>a=[2]
>>>b=a
>>>a.append(3)
>>>b
[2,3]
当执行a.append时,因为列表的值是可以变化的,所以就在原来的存放a的内存地址改变了a的值,由于a,b
是指向同一地址空间的索引,所以当此内存地址所存储的值被改变时,打印b时,b的值也变化了。