欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python3多目标赋值及共享引用注意事项

程序员文章站 2022-06-03 17:37:52
python中多目标赋值即将等号左边所有的变量名都赋值给右边的对象,完成赋值操作,比如将三个变量同时赋值给一个字符串。 a = b = c = 'python'...

python中多目标赋值即将等号左边所有的变量名都赋值给右边的对象,完成赋值操作,比如将三个变量同时赋值给一个字符串。

a = b = c = 'python'
print(a)
print(b)
print(c)

示例结果:

python
python
python

在多目标赋值中,其本质即类似三个变量的指针指向了同一个内存空间,即三个变量共享了内存内同一对象。

不可变对象

对于不可变对象来说,我们在使用这些变量是不存在问题的。

a = b = c = 'python'
print(a)
print(b)
print(c)
a = 'i like python'
b = 'python make me happy'
print(a)
print(b)
print(c)

示例结果:

i like python
python make me happy
python

可以看到这些变量并不会互相影响。

可变对象

而对可变对象来说,比如列表,字典等,多目标赋值变量的使用便会变得棘手些。

l1 = l2 = [1, 2, 3, 4, 5]
print(l1)
print(l2)
# 更改列表l2,从列表尾部删除一个元素
l2.pop()
print(l1)
print(l2)

示例结果:

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4]
[1, 2, 3, 4]

即当我们在使用多目标赋值时,需要考虑对象本身属性是否为可变对象,否则我们应该考虑对每个变量名进行单独赋值或者利用浅拷贝、深拷贝(参考上上...上节《python列表赋值,复制,深拷贝以及5种浅拷贝详解》)等方式完成多变量的可变对象的赋值,比如我们对多变量进行分别赋值。

l1 = [1, 2, 3, 4, 5]
l2 = [1, 2, 3, 4, 5]
print(l1)
print(l2)
print(id(l1), id(l2))
l2.pop()
print(l1)
print(l2)

示例结果:

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
2600790220872 2600790206216
[1, 2, 3, 4, 5]
[1, 2, 3, 4]

总结

以上所述是小编给大家介绍的python3多目标赋值及共享引用注意事项,希望对大家有所帮助