首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非幂等Python

非幂等Python
EN

Code Golf用户
提问于 2015-07-30 19:55:29
回答 7查看 1.8K关注 0票数 10

编写几行Python代码,X,它不引用任何全局变量,例如

代码语言:javascript
复制
def method():
    X
    print(a)

method()

打印1但是

代码语言:javascript
复制
def method():
    X
    X
    print(a)

method()

打印2

所以,我不想成为一个粘人的人,但似乎varslocals实际上是Python中的全局变量:

代码语言:javascript
复制
def test_global_1():
    global vars, locals
    vars = lambda: 2
    locals = lambda: 3

def test_global_2():
    print(vars())
    print(locals())

test_global_1()
test_global_2()

而且,看起来人们希望看到这样的拼图的客观获胜标准。代码长度在这里感觉不太对,所以也许我们可以为代码的各种新特性建立一个布朗尼点系统?我不确定这些可能是什么,但这里有一个开始:

  • +1表示真正没有全局(没有varslocals)
  • +1作为第一个发布特定技术的
  • +1表示最短的解决方案
  • +1用于只涉及一个Python语句的解决方案
  • +1用于有趣的“hack”,例如在词法无边界处连接。
  • +1不使用例外情况

如果你能想到更多,你可以编辑这个问题来添加到列表中。

这个问题能否在不使用异常的情况下得到解决,也不需要使用像varslocals这样的全局变量?我想是可以的,虽然我还没弄清楚到底是怎么回事.

EN

回答 7

Code Golf用户

回答已采纳

发布于 2015-07-30 19:59:31

代码语言:javascript
复制
def method():
    if 'a' not in vars():a=0
    a+=1
    if 'a' not in vars():a=0
    a+=1
    print(a)

只有在变量表中尚未初始化的情况下,才将变量a初始化为0。然后,增加它。

更简单地说(感谢len的组织格拉特):

代码语言:javascript
复制
def method():
    a=len(vars())+1
    a=len(vars())+1
    print(a)

如果X的两个副本可以在同一条线上,我们可以这样做

代码语言:javascript
复制
a=0;a+=1;a

双倍到

代码语言:javascript
复制
a=0;a+=1;aa=0;a+=1;a

与“牺牲羔羊”aa吃了第二个变量分配。

票数 12
EN

Code Golf用户

发布于 2015-07-30 21:33:20

Python

考虑到这个解决方案,因为tryexcept是我第一次想到确定变量是否存在的方法。

代码语言:javascript
复制
def method():
    try:a+=1
    except:a=1
    print(a)
票数 9
EN

Code Golf用户

发布于 2015-07-30 21:56:32

Python 2

代码语言:javascript
复制
def method():
    exec'';locals()['a']=locals().get('a',0)+1
    exec'';locals()['a']=locals().get('a',0)+1
    print a

method()

基本上,当在Python2中遇到exec时,它会从method.func_code.co_flags中移除一个特殊标志(0x01),这使得locals赋值产生了影响。我利用它来实现nonlocalPython 2中的支持 (修改标志的xor请参见第43行)。

票数 5
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/54082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档