关于python赋值的迷思

参考链接
写这篇文章的原因在于写链表逆序时看到的python代码,语法糖真香啊,同时也发现了自己对python赋值方面的错误理解

一、 题目及python代码

链表节点两两互换leetcode

def swapPairs(self, head):
    pre, pre.next = self, head
    while pre.next and pre.next.next:
        a = pre.next
        b = a.next
        pre.next, b.next, a.next = b, a, b.next
        pre = a
    return self.next

对于函数中对self的操作,以后有时间再写

二、 赋值举例

1. 下例的连续赋值,起到了交换变量a, b的作用,但实际上真的只是变量交换吗

>>> a = 1
>>> b = 3
>>> a, b
(1, 3)
>>> a, b = b, a
>>> a, b
(3, 1)

2. 大家觉得应该是(1, 3)还是(1, 1)呢

>>> a = 3
>>> b, a = a, 1
>>> a, b
(1, 3)

3. 是不是如果不用切片复制的话就有点不如人意

>>> values = list(range(1,5))
>>> values[2] = values
>>> values
[1, 2, [...], 4]
# 使用切片复制
>>> values[2] = values[:]
>>> values
[1, 2, [1, 2, 3, 4], 4]

4. 用了切片复制,列表b的值还是被改变了

>>> a = [0, [1, 2], 3]
>>> b = a[:]
>>> a[0] = 8
>>> a[1][1] = 9
>>> a
[8, [1, 9], 3]
>>> b
[0, [1, 9], 3]

5. 使用deepcopy才能不干扰

>>> import copy
>>> a = [0, [1, 2], 3]
>>> b = copy.deepcopy(a)
>>> a[0] = 8
>>> a[1][1] = 9
>>> a
[8, [1, 9], 3]
>>> b
[0, [1, 2], 3]

三、牵扯出来的顶层复制以及深拷贝的问题

  1. python中的变量当作引用来理解的话,所有问题都可以迎刃而解
  2. 对于连续赋值的问题,它并不是从右到左依次赋值,理解为右侧的内存地址一次性赋值到左侧,这可以解释2.1与2.2的疑惑
  3. 如果不使用切片复制的话,相当于values中的元素引用了本身,构成了循环
  4. 切片复制、字典copy方法都属于顶层复制,只有最上层的数据不会被更改,这是2.4中列表b被修改的原因
  5. deepcopy函数是深拷贝,其实是递归拷贝,不会产生数据被顺道修改的问题

如果看完文章还有哪里有疑问,可以看文章开头的参考链接,非常的详细

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 12,227评论 1 118
  • 个人笔记,方便自己查阅使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik阅读 67,823评论 0 5
  • Table of Contents Python语言特性1 对Python的理解(对比其他语言)2 什么是Pyth...
    Jeese_zhao阅读 7,588评论 0 5
  • “今晚决赛,最后一首歌了。我要把它送给一个没在现场的人,希望她能听到。”于是曲终人散,台下观众的欢呼还未散去,气氛...
    艾特长情阅读 1,937评论 0 0
  • 在宁静中予以归人 那久违的期待 是远方 在骇浪中闪烁希望 那点点的星光 是途路 远方靠路 路却丢失了远方 与其给鱼...
    江城流浪阅读 1,852评论 1 0