首页 > 其他分享 >[转载]TCL全局变量与双冒号变量

[转载]TCL全局变量与双冒号变量

时间:2023-09-14 11:24:35浏览次数:36  
标签:set return global per TCL 冒号 MyVar 全局变量 proc

在TCL中,以下代码之间有何区别:

代码

global MyVar
set MyVar 5

和代码

set ::MyVar 5 

据我了解,:: MyVar表示MyVar将是一个全局变量。那么区别是什么呢?

1 个答案:

答案 0 :(得分:4)

如果这是在过程中,则设置哪个变量或放入哪个值没有功能上的区别。 (global在过程之外以及其他对局部变量表(例如lambda和方法)无效。)

在实际操作上存在实际差异的地方。特别地,global只需设置一次,以便将来进行非限定变量访问很快,而使用限定形式始终进行完整查找(可能涉及多个哈希表访问)。这样的效果是,虽然使用完全限定的格式一次读取或写入会更快,但是如果使用global完成多次访问,则总是会更快(并且在global调用中使用多个变量会产生更大的影响,因为其中一些费用可以摊销。

但是不要相信我。进行一些示例过程并使用time自己进行测试,也许像这样:

proc write1 {} {
    global MyVar
    set MyVar 5
    return
}
proc write2 {} {
    global MyVar
    set MyVar 5
    set MyVar 5
    return
}
proc write3 {} {
    global MyVar MyOtherVar
    set MyVar 5
    set MyOtherVar 5
    return
}
proc write4 {} {
    global MyVar MyOtherVar
    set MyVar 5
    set MyOtherVar 5
    set MyVar 5
    set MyOtherVar 5
    return
}
proc write5 {} {
    set ::MyVar 5
    return
}
proc write6 {} {
    set ::MyVar 5
    set ::MyVar 5
    return
}
proc write7 {} {
    set ::MyVar 5
    set ::MyOtherVar 5
    return
}
proc write8 {} {
    set ::MyVar 5
    set ::MyOtherVar 5
    set ::MyVar 5
    set ::MyOtherVar 5
    return
}

foreach cmd {write1 write2 write3 write4 write5 write6 write7 write8} {
    # Execute once to ensure everything is internally optimised
    $cmd
    # Now the timing run
    puts "$cmd : [time { $cmd } 100000]"
}

在运行Tcl 8.6.9的笔记本电脑上(现在已经有几年的历史了),我得到了:

write1 : 0.62610808 microseconds per iteration
write2 : 0.63969525 microseconds per iteration
write3 : 0.73437284 microseconds per iteration
write4 : 0.7519245699999999 microseconds per iteration
write5 : 0.62230006 microseconds per iteration
write6 : 0.8437912799999999 microseconds per iteration
write7 : 0.8246234299999999 microseconds per iteration
write8 : 1.2297289900000001 microseconds per iteration

如您所见(并在您自己的硬件上进行确认),write1write5慢,但是对于其他每一对,使用global都是性能上的胜利。 (write3胜过write7,我感到有些惊讶,但数字并没有说谎。)

 

原文地址:https://www.thinbug.com/q/56152738

标签:set,return,global,per,TCL,冒号,MyVar,全局变量,proc
From: https://www.cnblogs.com/autumoonchina/p/17702046.html

相关文章

  • 同一类内部,类属性通用 类的继承,实例属性通用,类属性不通用 解决办法: 声明为全局变
    '''属性的继承'''classClass_1:importpandasaspd#储存pd,但不储存pandasprint(pd)#无需实例化deffun_1(pd=pd):print(pd)fun_1()#无需实例化def__init__(self,pd=pd):print(pd)self.pd=pd......
  • _tkinter.TclError: invalid command name ".!label.!text" 原因及方法
    文本框对象报错_tkinter.TclError:invalidcommandname".!label.!text"具体背景:创建txt文本框,用for循环去创建文本框,然后全局变量接受文本框对象,重复进入界面后就出现错误提示提示对象名无效,回去翻看代码得出原因,下列是源代码text_boxes=[]#外部数组用于存储文本框对......
  • Python中跨越多个文件使用全局变量
    这个琐碎的指南是关于在Python中跨多个文件使用全局变量。但是在进入主题之前,让我们简单地看看全局变量和它们在多个文件中的用途。Python中的全局变量全局变量是不属于函数范围的变量,可以在整个程序中使用。这表明全局变量也可以在函数体内部或外部使用。让我们看一个例子:......
  • 局部变量和全局变量
    变量的作用域:局部变量全局变量 1)局部变量:在一个函数内部定义的变量或者函数的形参,统称为局部变量。eg:voidf(inti){intj=20;}     i和j都是局部变量2)全局变量:在所有函数外部的变量叫......
  • 【C++】C++ 引用详解 ④ ( 函数返回 静态变量 / 全局变量 的 引用 / 指针 )
    文章目录一、函数返回静态变量/全局变量的引用/指针1、函数返回局部变量引用或指针无意义2、函数返回静态变量/全局变量的引用或指针3、代码示例-函数返回静态变量/全局变量的引用或指针一、函数返回静态变量/全局变量的引用/指针1、函数返回局部变量引用或指针......
  • ThreadLocal:线程中的全局变量 | 京东云技术团队
    最近接了一个新需求,业务场景上需要在原有基础上新增2个字段,接口新增参数意味着很多类和方法的逻辑都需要改变,需要先判断是否属于该业务场景,再做对应的逻辑。原本的打算是在入口处新增变量,在操作数据的时候进行逻辑判断将变量进行存储或查询。如果全链路都变更入参和结构,很明显代码......
  • ThreadLocal:线程中的全局变量
    最近接了一个新需求,业务场景上需要在原有基础上新增2个字段,接口新增参数意味着很多类和方法的逻辑都需要改变,需要先判断是否属于该业务场景,再做对应的逻辑。原本的打算是在入口处新增变量,在操作数据的时候进行逻辑判断将变量进行存储或查询。如果全链路都变更入参和结构,很明显代......
  • C语言——全局变量和局部变量重名了会怎么样
    前言(1)今天在交流群里面看到这样一个问题:为什么这个程序中下面我定义的void型函数smart在全局变量前声明了,但是在man函数中调用了smart函数,m的值打印出来还是0。#include<stdio.h>intm;voidsmart(void);intmain(void){ printf("m=%d.\n",m); smart(); printf("m=......
  • fastapi 的 TestClient 的 delete 方法如何传递请求体?
    在FastAPI的TestClient中,delete方法通常不适用于传递请求体(payload)。DELETE请求通常不允许发送请求体。不过,根据HTTP规范,您可以通过在URL中包含查询参数或使用params参数来传递参数。以下是使用FastAPI的TestClient进行DELETE请求时传递参数的示例:fromfastapi.testclientimportT......
  • .super.getClass()方法调用?
    下面程序的输出结果是多少?importjava.util.Date;publicclassTestextendsDate{publicstaticvoidmain(String[]args){newTest().test();}publicvoidtest(){System.out.println(super.getClass().getName());}}答:结果是Test。原因:在test方法中,直接调用getC......