Python中文
首页
教程
问答
标签
搜索
登录
注册
使用类作为局部变量的容器对象,以替代Python中的“非局部”
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p><strong>问题</p> <p>在Python中,如果我有一个带有局部变量和嵌套函数的函数,我可以借助非局部变量在嵌套函数中分配这些变量:</p> <pre><code>def f(): x = 0 def _g(): nonlocal x x = 1 def _h(): x = 2 _g() _h() print(x) f() # 1 </code></pre> <p>这个解决方案的问题是,如果我在f()中有许多局部变量,那么使用非局部变量是冗长的,而且更令人不安的是,很容易忘记变量的非局部性,并且在嵌套函数中创建局部变量而没有注意到它(例如,我在上面的h()函数中真正的意思是什么?)。你知道吗</p> <p>我看到并使用了另一种方法:</p> <pre><code>def f(): class state: x = 0 def _g(): state.x = 1 def _h(): x = 2 _g() _h() print(state.x) f() # 1 </code></pre> <p>If使用Python中的类实际上也是一个对象这一事实。以这种方式使用“class”实际上是为本地值创建可变容器的最简单的方法(我相信)。你知道吗</p> <p>我认为这种模式有两个值得怀疑的方面:</p> <ul> <li>“class”关键字的这种特殊用法可能被认为是一种黑客行为。你知道吗</li> <li>由于容器有点人造,所以有时很难为它找到一个好名字(我甚至测试了“self”这个名字的用法,但这看起来更像是一个黑客攻击)。你知道吗</li> </ul> <p>这是个好模式吗?你通常用什么替代品?你知道吗</p> <p>如果StackOverflow不是这个问题的合适论坛,请在您认为更适合的其他论坛上提出建议(我确实阅读了常见问题解答,但我并不清楚这个问题的正确论坛是什么)。你知道吗</p> <p>提前谢谢。你知道吗</p> <p>附言</p> <p>为了完整起见,至少还有一种选择,感觉更像黑客:</p> <pre><code>class f: def __init__(self): self.x = 0 self._g() self._h() print(self.x) def _g(self): self.x = 1 def _h(self): x = 2 f() # 1 </code></pre> <p>这是因为在Python中,类实例化与函数调用具有相同的语法。你知道吗</p> <p><strong>回答</strong></p> <p>请参阅下面接受的答案。有关函数需要返回值时解决方案的讨论,请参见<a href="https://codereview.stackexchange.com/a/179294/36066">there</a>。你知道吗</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>为什么不直接使用<code>dict</code>而不是类呢。这消除了一些“hackynes”,并且与Python 2兼容:</p> <pre><code>def f(): state=dict(x=0) def _g(): state["x"] = 1 def _h(): x = 2 _g() _h() print(state["x"]) f() # 1 </code></pre>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
使用Python创建一个非常大的二进制频率矩阵来运行协作过滤
7 回答
使用Python创建一张HTML网页,其中在不同颜色中重复n遍显示“Hello World”的方法
3 回答
使用Python创建一组唯一的值length L
9 回答
使用python创建不同表格的透视表
9 回答
使用python创建不和谐频道
3 回答
使用python创建不存在的多个文件夹
2 回答
使用python创建串行远程文件
4 回答
使用python创建交互式仪表板时出现问题
8 回答
使用python创建交互式绘图
4 回答
使用python创建交互式自动电子邮件
7 回答
使用Python创建价格列表
1 回答
使用python创建修改的txt文件
2 回答
使用Python创建全局变量,初始化后更改值
7 回答
使用Python创建关键字搜索词数组
3 回答
使用Python创建具有不均匀块大小/堆叠条形图的热图
4 回答
使用Python创建具有依赖于另一列的值的列
3 回答
使用Python创建具有多列的HTML表
8 回答
使用Python创建具有时间范围数据的等距数据帧
1 回答
使用Python创建具有特定顺序或属性的XML文件
6 回答
使用Python创建具有级联功能的搜索栏
3 回答