跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 学了 1 年 Python ,今天看了段代码觉得白学了,求教一下大家
未分類
25 2 月 2021

学了 1 年 Python ,今天看了段代码觉得白学了,求教一下大家

学了 1 年 Python ,今天看了段代码觉得白学了,求教一下大家

資深大佬 : zhoudaiyu 3

把代码精简了一下

学了 1 年 Python ,今天看了段代码觉得白学了,求教一下大家

我本以为输出结果会是个[[],[]],输出结果是个列表嵌套了两个列表,每个列表里又嵌套了 2 个列表…

学了 1 年 Python ,今天看了段代码觉得白学了,求教一下大家

猜测是个递归,debug 一下确实是这样的

学了 1 年 Python ,今天看了段代码觉得白学了,求教一下大家

有几个问题:

1 、这个为啥是个递归?
2 、这个递归为什么没有爆栈?
3 、修改了一下代码,为什么返回了(True, True)?

学了 1 年 Python ,今天看了段代码觉得白学了,求教一下大家

大佬有話說 (20)

  • 資深大佬 : chaosgoo

    1.root 里面放了两个 root 的引用
    2.root 里面只是存了两个地址而已
    3.自己和自己比较当然是 True

  • 資深大佬 : THESDZ

    实参,形参

  • 主 資深大佬 : zhoudaiyu

    @zhoudaiyu

    大家忽略最后一个问题,脑残了

  • 資深大佬 : aijam

    相当于:
    root = []
    root.append(root)
    root.append(root)

  • 資深大佬 : vicalloy

    同上,就是一个递推的引用,换成 dict 是不是就好理解多了。
    >>> o = {}
    >>> o[‘o’] = o
    >>> o
    {‘o’: {…}}

  • 資深大佬 : Vegetable

    Circular reference detected

    给你化简一下吧
    root = []
    root.append(root)

  • 資深大佬 : aijam

    先理解下面什么意思,也就好理解了
    root = []
    root.append(root)

  • 資深大佬 : nznd

    >>> root=[]
    >>> id(root)
    2296081934592
    >>> id(root[:])
    2296081935040
    >>> root[:]=[root,root]
    >>> id(root)
    2296081934592
    >>> id(root[:])
    2296081935040
    >>> id(root[0])
    2296081934592
    >>> id(root[1])
    2296081934592
    简单来说 就是 root[0] 和 root[1] 都指向了 root,root[:]是 root 的一个指针(类似的概念 忘了叫啥了,刷 leetcode 可以用这个装作是原地算法(直接改这个值

  • 資深大佬 : acmore

    魔法就是自指广义表:
    root = []
    root.append(root)

    另外基本上所有语言都可以这么玩,不只是 Python

  • 資深大佬 : RockShake

    自己引用了自己,死循环,print 无法打印出所有

  • 資深大佬 : SystemLight

    root[:]=[1,2]和 root=[1,2]两种写法有啥区别

  • 資深大佬 : karloku

    1.
    上面都回答了

    2.
    爆栈对应于堆栈. 变量引用不会建立堆栈, 自然没有爆栈问题.
    如果你准备用递归的函数来深层处理这个变量, 每次函数调用都会建立堆栈, 那基本就要爆了.

  • 資深大佬 : karatsuba

    这个不限于[], 即 root=[1], root=root.append(root),也会是[1, […]]

  • 資深大佬 : Jirajine

    一切皆对象(的引用)
    因而所有变量都是引用类型(值类型可以看作是一种 inline 优化,因而可以看作引用类型)

  • 資深大佬 : lizytalk

    你想说 root[0] == root 和 root[0] is root 都是 True ? root=root 和 root is root 是 True 没什么可说的吧

  • 資深大佬 : dayeye2006199

    这个写法有什么实际用途吗?想学习一下魔法

  • 資深大佬 : SjwNo1

    可变类型 地址引用

  • 資深大佬 : no1xsyzy

    数据自指不叫递归,因为它不会执行。

    @SystemLight 一个修改 list 内容,一个修改 locals() 绑定。

  • 資深大佬 : cassidyhere

    标准库 functools.lru_cache 把它当双向链表用
    摘部分代码:
    PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields
    root = [] # root of the circular doubly linked list
    root[:] = [root, root, None, None] # initialize by pointing to self

    # Use the old root to store the new key and result.
    oldroot = root
    oldroot[KEY] = key
    oldroot[RESULT] = result
    # Empty the oldest link and make it the new root.
    # Keep a reference to the old key and old result to
    # prevent their ref counts from going to zero during the
    # update. That will prevent potentially arbitrary object
    # clean-up code (i.e. __del__) from running while we’re
    # still adjusting the links.
    root = oldroot[NEXT]
    oldkey = root[KEY]
    oldresult = root[RESULT]
    root[KEY] = root[RESULT] = None

  • 資深大佬 : lithbitren

    只要引用名归零或者作用域销毁,循环引用也是可以被 GC 的

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具