Python3 列表能被闭包函数使用,整数变量却不行呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
DuDuDu0o0
V2EX    程序员

Python3 列表能被闭包函数使用,整数变量却不行呢?

  •  
  •   DuDuDu0o0 2022-04-20 18:44:30 +08:00 2046 次点击
    这是一个创建于 1320 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题:

    最近在使用 python3 刷题,发现一个比较奇怪的现象,想用闭包的特性去使用一个外层作用域的变量,如果这个变量是 list 的话,则 ok ,非 list 就会报错,我需要怎么做才可以闭包使用整数变量呢

    如下面 ide 截图这样: https://imgtu.com/i/LsNiB8

    代码如下:

    class Solution: def isValidBST(self, root: TreeNode) -> bool: pre = -sys.maxsize -1 o = [] def trace(root) -> bool: if not root: return True if not trace(root.left): return False o.append(root.val) # 为什么 list 可以被闭包进来 if pre >= root.val: # 但是整数变量却不行呢? return False else: pre = root.val if not trace(root.right):return False return True return trace(root) 
    6 条回复    2022-04-21 09:13:41 +08:00
    eurekavip
        1
    eurekavip  
       2022-04-20 18:52:04 +08:00
    python 里面赋值会自动变成局部变量,你的 else 里面有赋值操作:pre = root.val
    DuDuDu0o0
        2
    DuDuDu0o0  
    OP
       2022-04-20 18:55:42 +08:00
    @eurekavip 感谢,我把 pre = root.val 注释之后确实没报错了,
    有什么办法能在 闭包里 对外面的变量赋值呢?难道只能 read ?
    pursuer
        3
    pursuer  
       2022-04-20 18:58:43 +08:00
    使用 nonlocal 引入外部变量
    LeeReamond
        4
    LeeReamond  
       2022-04-20 22:23:02 +08:00   3
    这是语言特性,具体问题就是子 block 对父 block 中资源的处理方案,各个语言对这三点的处理不尽相同,一般的三个问题是 1 、能否感知,2 、能否读取,3 、能否修改。

    就 python 来说是能感知和读取,修改的话会创建副本,所以父 block 不用担心变量被子 block 或调用乱改。可能有一些考量在,虽然目前我个人来说更喜欢闭包可以全权修改的方案。

    解决方案一般是 nonlocal 或者传递指针,传递指针是指传进子 block 的是对象或者[0,],子 block 中用 item.property += 1 或者 item[0] += 1 的方式修改。nonlocal 效率更高,不过传指针更灵活一些,性能其实倒是不太有所谓,python 列表单次寻址耗时大概是 20 纳秒左右,在绝大多数场景中这并不是值得在意的开销。
    stimw
        5
    stimw  
       2022-04-21 01:11:41 +08:00 via iPhone
    我的 c++只用来刷题。。
        6
    cheng6563  
       2022-04-21 09:13:41 +08:00
    你套个 list 就行了,只有一个变量的 list 。
    cheng6563
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2611 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 15:01 PVG 23:01 LAX 07:01 JFK 10:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86