为什么Python没有静态变量?

有一个问题问如何在python中模拟静态变量。

另外,在网上可以找到许多创建静态变量的解决方案。 (尽管我还没有看到我喜欢的一个。)

为什么Python不支持方法中的静态变量? 这被认为是非Python的,还是与Python的语法有关?

编辑:

我专门询问了为什么进行设计决策,但我没有提供任何代码示例,因为我想避免解释来模拟静态变量。

Georg Schölly asked 2020-02-22T23:28:07Z

9个解决方案

77 votes

忽略这一点的想法是,静态变量仅在以下两种情况下才有用:何时真正应该使用类以及何时真正应该使用生成器。

如果要将状态信息附加到函数,则需要一个类。 也许是一个简单的类,但是仍然是一个类:

def foo(bar):

static my_bar # doesn't work

if not my_bar:

my_bar = bar

do_stuff(my_bar)

foo(bar)

foo()

# -- becomes ->

class Foo(object):

def __init__(self, bar):

self.bar = bar

def __call__(self):

do_stuff(self.bar)

foo = Foo(bar)

foo()

foo()

如果您希望函数的行为在每次调用时都发生变化,则需要一个生成器:

def foo(bar):

static my_bar # doesn't work

if not my_bar:

my_bar = bar

my_bar = my_bar * 3 % 5

return my_bar

foo(bar)

foo()

# -- becomes ->

def foogen(bar):

my_bar = bar

while True:

my_bar = my_bar * 3 % 5

yield my_bar

foo = foogen(bar)

foo.next()

foo.next()

当然,静态变量对于那些不想处理小任务的大型结构的麻烦的快速脚本很有用。 但是在那儿,您实际上只需要global就可以了,这似乎有点麻烦,但是对于小的一次性脚本来说,这是可以的:

def foo():

global bar

do_stuff(bar)

foo()

foo()

Ben Blank answered 2020-02-22T23:28:34Z

19 votes

类的一种替代方法是函数属性:

def foo(arg):

if not hasattr(foo, 'cache'):

foo.cache = get_data_dict()

return foo.cache[arg]

虽然一门课可能更干净,但我认为这种技术可能有用并且更好,比全局性更好。

davidavr answered 2020-02-22T23:28:59Z

8 votes

在Python 3中,我将使用闭包:

def makefoo():

x = 0

def foo():

nonlocal x

x += 1

return x

return foo

foo = makefoo()

print(foo())

print(foo())

Josh Lee answered 2020-02-22T23:29:19Z

6 votes

我认为局部静态变量的大多数用途是模拟生成器,即具有执行某个过程迭代的某些函数,返回结果,但保留后续调用的状态。 Python使用yield命令非常优雅地处理了这一问题,因此似乎并不需要太多静态变量。

Il-Bhima answered 2020-02-22T23:29:39Z

5 votes

这是一种设计选择。

我假设Guido认为您不经常需要它们,而您从未真正需要它们:您始终可以只使用一个全局变量,并告诉每个人将它们的油腻腻的东西放在您的变量中;-)

Jonas Kölker answered 2020-02-22T23:30:04Z

4 votes

出于缓存或记忆的目的,装饰器可以用作一种优雅且通用的解决方案。

Mr Fooz answered 2020-02-22T23:30:24Z

0 votes

答案与为什么没人使用静态方法(即使它们存在)几乎相同。 您有一个模块级名称空间,其作用与类相同。

Jason Baker answered 2020-02-22T23:30:44Z

0 votes

一个不明智的选择:

您还可以使用函数默认值的定义时间评估的副作用:

def func(initial=0, my_static=[])

if not my_static:

my_static.append(initial)

my_static[0] += 1

return my_static[0]

print func(0), func(0), func(0)

它确实很丑陋,很容易被颠覆,但是有效。 imo,使用global比这更干净。

Richard Levasseur answered 2020-02-22T23:31:13Z

-1 votes

根据您的评论之一:“我想使用它们来缓存从磁盘加载的内容。如果可以将它们分配给函数,我认为它会使实例混乱的程度减少了”

然后,将缓存类用作其他类的类或实例属性。 这样,您可以使用完整的类功能集,而不会造成其他问题。 此外,您还将获得可重复使用的工具。

这表明,在SO上始终可以陈述一个人的问题,而不是要求一个特定的低级解决方案(例如缺少语言功能)。 这样一来,不必再有关于模拟“静态”(在我看来,这是古老语言中已弃用的功能)的无休止的辩论,而是可以早日给您一个很好的答案。

Ber answered 2020-02-22T23:31:43Z

python静态变量命名_为什么Python没有静态变量?相关推荐

  1. python 语言变量命名规则的是_Python中变量命名规则有哪些

    Python中变量命名规则有哪些 发布时间:2020-09-24 13:05:21 来源:亿速云 阅读:72 今天就跟大家聊聊有关Python中变量命名规则有哪些,可能很多人都不太了解,为了让大家更加 ...

  2. python除法函数一般如何命名_关于python:当用于除法时,’/’和’//’之间有什么区别?...

    使用一个对另一个有好处吗?在Python2中,它们似乎都返回相同的结果: >>> 6/3 2 >>> 6//3 2 请参考整数除法的问题,因为引入了//运算符进行整 ...

  3. python中none算变量吗_在python中对变量判断是否为None的三种方法总结

    三种主要的写法有: 第一种:if X is None; 第二种:if not X: 当X为None,  False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()这 ...

  4. python文件批量重命名以数字~n的方式重命名_利用Python对文件进行批量重命名

    最近几天工作的内容是对40个项目进行考核,每个项目都需要一个考核评分表,已经有了项目的列表. 如果用常规的方法,需要复制40个文件,并逐个修改,不光工作量大,也容易出错,后期修改也不方便. 于是想到了 ...

  5. python 静态网站生成_最全的静态网站生成器(开源项目)

    2017 年,最热开源静态网站生成器 TOP 20 揭晓! 2019独角兽企业重金招聘Python工程师标准>>> ... 史上最全的静态网站生成器Static Site Gener ...

  6. python大牛 关东升_《Python从小白到大牛》第4章 Python语法基础

    本章主要为大家介绍Python的一些语法,其中包括标识符.关键字.常量.变量.表达式.语句.注释.模块和包等内容. 标识符和关键字 任何一种计算机语言都离不开标识符和关键字,因此下面将详细介绍Pyth ...

  7. python新手入门总结_初学python的操作难点总结(新手必看篇)

    如下所示: 1 在cmd下 盘与盘之间的切换 直接 D或d: 就好 2 查找当前盘或者文件下面的目录 直接 dir 3 想在一个盘下进去一个文件夹,用cd空格目标文件 cd p 4 写文件的第一个字母 ...

  8. python出现的意义_[转]Python中下划线以及命名空间的意义

    Python 用下划线作为变量前缀和后缀指定特殊变量/方法. 主要存在四种情形 1. 1. object # public 2. __object__ # special, python system ...

  9. python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议

    <Python之禅>中对于Python编程过程中的一些建议 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  <Python之禅>中对于Pyt ...

最新文章

  1. (NO.00003)iOS游戏简单的机器人投射游戏成形记(二)
  2. 使用Microsoft Visual Studio安装AsmDude插件
  3. 百度高德位置定位服务器,调用百度、高德地图App,百度地图网页版,App定位
  4. Batch Normalization导读
  5. t4 tornado 模板
  6. 团队开发冲刺1.2(2015.5.10)
  7. [Android] Android 任务栈 【转载】
  8. ROS学习记录:基于Python的ROS话题消息编程
  9. matlab 蒙特卡洛工具箱_MATLAB多维T分布蒙特卡洛?
  10. web开发必备的几个软件
  11. 怎样稳稳获得年化高收益
  12. java snakeyaml_SnakeYaml快速入门和使用
  13. http://blog.csdn.net/lnb333666/article/details/8546497
  14. Springboot读取excel
  15. JAVA设计模式--建造者模式
  16. nacos get changed dataId error, code: 403
  17. Flink DataStream时间水印机制
  18. uniapp小程序 触底刷新(onReachBottom)加载分页
  19. 【2022最新】手把手教你拥有自己的服务器与网站(无需备案)
  20. c语言程序设计复试都考哪些,2016年首都师范大学信息工程学院C语言程序设计考研复试题库...

热门文章

  1. 1计算机等级考试 12月,2017年12月计算机二级MS Office考试上机冲刺题(1)
  2. 那些程序员才懂的梗,看到第10张笑喷了
  3. 暴力摩托(NDK1045)
  4. 读书笔记之《自控力》
  5. 带你深入了解Java!一、那些不为人所知的”秘密“!
  6. Java中Set为什么不能存放重复值
  7. matlab对图像操作函数的详解(笔记1)
  8. Vue3 中使用组合式API替换mixins,实现代码复用并解决隐患
  9. PHP实现显示日期和年月日代码(四行代码实现)
  10. linux开机动画制作教程,【转载】开机动画的制作过程(bootanimation.zip)