精华内容
下载资源
问答
  • 谈Python的引用和变量上一次我们介绍了一个有用的代码可视化工具Python Tutor,说到我们还要通过这个工具探讨一下Python引用相关的话题。因此有了本文。引用观察代码框下方的布局,可以看到两个按钮之下还有三个...

    再谈Python的引用和变量

    上一次我们介绍了一个有用的代码可视化工具Python Tutor,说到我们还要通过这个工具再探讨一下Python引用相关的话题。因此有了本文。

    引用

    观察代码框下方的布局,可以看到两个按钮之下还有三个下拉菜单,依次点击之后本酱发现了一个神奇的选项:render all objects on the heap (Python/Java)。即图中红框处下拉菜单的第三个选项:

    e57c6f29b2a129b5c7765f57c8b4f7c1.png

    这个选项什么意思呢?翻译一下就是“对于Python和Java两种语言,该工具可以渲染出堆上的所有对象”。

    堆是什么意思暂时不用我们操心,只需要知道这么个东西也不影响我们进一步理解接下来的内容。简单地介绍一下,即程序运行过程中,所有的对象都会在堆上创建维护。

    换言之这句话的潜在含义就是会将程序中的所有对象渲染出来。

    好嘛,说来说去半天了,这个选项到底干嘛的呀?就不能给个痛快话吗?

    在之前讨论引用的文章中我们提到过,“在Python中,一切皆对象”。但在之前的图示中有的东西好像不那么一样——整数好像是不可分割的。

    使用下面的代码试试:

     a = 1
     b = a
     c = 1

    默认图示:

    dcd9d1da19b87aacb108a3cec86b362d.png

    这好家伙,你还敢说什么“一切皆对象”?整数不就是一个高尚的,哦不,纯粹的数字吗?同样是直接赋值,变量ab之间并没有任何关系啊。

    这就是这个工具的一点不足了——也说不上不足,实际上也是为用户考虑的结果——但是这样一来,不少粗心的用户,咳,其实是还没开始认真学英语的用户,就很容易忽视下面的选项,从而怀疑自己学到的东西都是个啥。

    放一万个心,你学到的东西都没错,错的是这个世界(记得划掉)这个选项。

    让我们把选项切换为“render all objects on the heap (Python/Java)”重新执行一次代码:

    269d87a69593990a8f288c2d78e2dbf8.png

    仿佛有什么奇怪的事情发生了……

    那些指向数字“1”的箭头都是什么鬼啊啊啊啊?(怒吼)

    这些都是引用啊~

    实际上即使是数字,在Python也是以对象的形式存在的,拥有对应的值、对应的引用以及其他一些属性;只是我们很少称其为“整数对象”。

    通常来说,像数字这样我们称之为“基本类型”的数据,既有其特殊的一面,在实际编程中也极为常用,为了避免图示过于混乱——毕竟各种箭头拉过来拉过去的,想不乱也不行啊——Python Tutor默认会将基本类型的数据内联于引用它的元素。

    到这里,之前的误会也就解开了。并不是因为Python中的数字特殊到不属于对象的范畴,仅仅是因为我们使用的工具默默地对其进行了“优化”。这种优化说不上坏,但是在有的时候确实会对我们造成一定的困扰。

    因此,这里本酱特地提醒各位读者老爷一句:在使用工具的时候千万小心,不要过分依赖任何工具。即使是你认为完美的工具,你也不知道它暗地里对你做了什么(优化)。

    变量

    终于讨论到了变量。

    实际上刚看到陈老师的演示视频时,本酱第一时间想到的就是:这未免也太适合用来解释Python的变量了吧!

    简直完美符合了本酱的预期,只恨晚生二十年,未能早一步将设想付之行动,blabla……(此处省略后悔词句,嘴炮一时爽)刚巧也印证了刚才本酱关于工具的提醒——好像成了一个鸡生蛋蛋生鸡的循环哈哈。

    观察之前的任意一张示例图片,图示中的左侧均为变量帧Frame,也就是对于Python来说,变量本身之间并没有本质上的差异;并且我们早已知道,Python中虽然有不同类型的数据,但是就特定的变量而言,它可以随时随地改变指向为另一种类型的数据。

    再进一步,实际上Python中的变量保存的一直都只是程序中各个对象的引用而已,只要规定好对象引用的大小规格,那么完全可以实现“同一个变量在不同的时期保存不同类型的数据”。

    举个简单的列子,比如Python中引用规定为8位二进制数,此时虽然引用0x01和引用0x02分别对应一个整数对象和一个列表对象,但是对保存8位二进制数的各个变量而言它们是没差的。谁管它到底是一个整数对象还是一个列表对象,就算是一个函数对象,那也和保存引用的变量没有关系。它孙行者造的孽,关我者行孙什么事哈哈。

    现在各位读者老爷理解了吧?

    在Python中,变量的地位十分之尴尬,变量本身并没有保存任何有效信息,并不像C等语言中变量本身即数据。Python中的变量,说得不好听一点儿,充其量就是一个个的标签,哪儿痛贴哪儿,啊呸,哪儿要贴哪儿,管你是人是鬼,先一发入魂。

    大家跟我一起念:Python变量是标签,哪里需要哪里粘(zhan)。

    总结

    本文通过恰当地使用工具Python Tutor,以一种更加生动形象的方式展示了Python中变量和引用的本质。大家应该善用这样的一些工具来帮助自己学习理解一些看似艰深的概念。

    参考资料

    《十分钟!彻底弄懂Python深拷贝与浅拷贝机制》(微博@爱可可-爱生活)

    Python Tutor主页

    Python 之引用

    展开全文
  • 当向以上里面再写代码时,老是出不来效果结果另起一行再在里面写函数$(function(){  $('#sj').bind('blur',function(){  validateWeikong('sj','sj_erro');//向一个id为sj的文本框绑定blur事件  });结果可以...

    <script src="validate.js" type="text/javascript" charset="gb2312">
    //document.getElementByIdx("sj").attachEvent("onblur", validateWeikong('sj','sj_erro'));
    </script>

    当向以上<script></script>里面再写代码时,老是出不来效果

    结果另起一行<script></script>再在里面写函数$(function(){
        $('#sj').bind('blur',function(){
            validateWeikong('sj','sj_erro');//向一个id为sj的文本框绑定blur事件
            });

    结果可以正常运行

    另,需要加上$(function(){},在页面加载完之后才运行。不然$('#sj').bind('blur',function(){
            validateWeikong('sj','sj_erro');代码无效!

    向控件绑定事件:

    //$('#partb1').bind('click',function(){

    // $("#treeform").dialog('open');

    //});

    // $('#searcheployee').click(function() {

    // $("#treeform").dialog('open');

    // });

    展开全文
  • 我自己定义了一个继承自gridview的类,主布局引用,想在主布局里添加一个button,然后这个button点击处理事件是自定义控件里的一个方法,该怎么调用? new mygridview().方法;不能实现,点击按钮后,程序崩溃
  • 做了一个项目,将所有的wpf子页面都放到类库里面了,在winform项目里面通过ElementHost来加载wpf...到winform项目里面去加载解决方案里面的wpf类库文件,需要注意的是winform项目也要引用包含了原始wpf页面的dll ...

    做了一个项目,将所有的wpf子页面都放到类库里面了,在winform项目里面通过ElementHost来加载wpf页面,但是发现在工具箱里面没有办法找到dll里面的wpf页面,于是只能在解决方案里面添加一个WPF类库,先引用需要的页面,再到winform项目里面去加载解决方案里面的wpf类库文件,需要注意的是winform项目也要引用包含了原始wpf页面的dll

    展开全文
  • 而弱类型语言中没有类型的概念,所有变量全都是一个类型(一般都是字符串的),程序在用的时候根据需要来处理变量。(2)c语言就是典型的强类型语言,c语言中所有的变量都有明确的类型;因为c语言...
    void类型本质1编程语言类型:(1)编程语言分两种:强类型语言和弱类型语言(比如PHP..n它就是弱类型语言);强类型语言中所有的变量都有自己固定的类型,这个类型有固定的内存占用,有固定的 解析方法;而弱类型语言中没有类型的概念,所有变量全都是一个类型(一般都是字符串的),程序在用的时候再根据需要来处理变量。(2)c语言就是典型的强类型语言,c语言中所有的变量都有明确的类型;因为c语言中的一个变量都要对应内存中的一段内存,编译器需要这个变量的类型来确定这个变量占用内存的字节数和这一段内存的解析方法。2数据类型的本质含义:(1)数据类型的本质就决定变量的内存占用数,和内存的解析方法。(2)所以得出结论:c语言中变量必须有确定的数据类型,如果一个变量没有确定的类型(就是所谓的无类型)会导致编译器无法给这个变量分配内存,也无法解析这个变量对应的内存,因此得出结论不可能有没有类型的变量。(3)但是c语言中可以有没有类型的内存;在内存还没有和具体的变量相绑定之前,内存就可以没有类型。实际上纯粹的内存就是没有类型的,内存只是因为和具体的变量相关联后才有了确定的类型(其实内存自己本身是不知道的,但是我们编译器知道,我们程序在使用这个内存时知道所以会按照类型的含义去进行内存的读和写)。3void类型的本质:(1)void类型的正确的含义是:不知道类型,不确定类型,还没确定类型。(2)比如说:void  a;它定义了一个void类型的变量,含义就是说a是一个变量,而且a肯定有确定的类型,只是目前我还不知道a的类型,还不确定,所以标记为void。4为什么需要void类型:(1)什么情况下需要void类型呢?其实就是在描述一段还没有具体使用的内存时需要使用类型。(2)void的一个典型应用,想必大多数读者都看到过,就是malloc的返回值;我们知道malloc向系统堆管理器申请一段内存给当前程序使用,malloc返回的是一个指针,这个指针指向申请的那段内存。malloc刚申请的这段内存尚未用来存储数据,malloc函数也无法预知这段内存将来被存放什么类型的数据,所以malloc无法返回具体类型的指针,解决方法就是返回一个void *类型,告诉外部我返回的是一段干净的内存空间,尚未确定类型。所以我们在这个malloc函数之后可以给这段内存读写任意类型的数据。下面是malloc函数的原型:
       #include 

       void *malloc(size_t size);
    (3)void *类型的指针指向的内存是尚未确定类型的,因此我们后续可以使用强制类型转换强行将其转换为各种类型;这就是void类型的最终归宿,就是被强制类型转换成一个具体类型。(4)void 类型使用时一般都是用void *,而不是仅仅使用void。NULL新媒体排版1NULL在C/C++中的标准定义:(1)NULL不是C语言关键字,本质上是一个宏定义。(2)NULL的标准定义:
       #ifdef _cplusplus            // 条件编译
       #define NULL 0
       #else
       #define NULL (void *)0        // 这里对应C语言的情况
       #endif

    解释:C++的编译环境中,编译器预先定义了一个宏_cplusplus,程序中可以用条件编译来判断当前的编译环境是C++的还是C的。NULL的本质解析:NULL的本质是0,但是这个0不是当一个数字解析,而是当一个内存地址来解析的,这个0其实是0x00000000,代表内存的0地址。(void *)0这个整体表达式表示一个指针,这个指针变量本身占4字节,地址在哪里取决于指针变量本身,但是这个指针变量的值是0,也就是说这个指针变量指向0地址(实际是0地址开始的一段内存)。

    2从指针角度理解NULL的本质:

    (1)int *p; p是一个函数内的局部变量,则p的值是随机的,也就是说p是一个野指针。

    (2)int *p = NULL; p是一个局部变量,分配在栈上的地址是由编译器决定的,我们不必关心,但是p的值是(void *)0,实际就是0,意思是指针p指向内存的0地址处。这时候p就不是野指针了。

    (3)为什么要让一个野指针指向内存地址0处?主要是因为在大部分的CPU中,内存的0地址处都不是可以随便访问的(一般都是操作系统严密管控区域,所以应用程序不能随便访问)。所以野指针指向了这个区域可以保证野指针不会造成误伤。如果程序无意识的解引用指向0地址处的野指针则会触发段错误。这样就可以提示你帮助你找到程序中的错误。

    3为什么需要NULL:

    (1)第一个作用就是让野指针指向0地址处安全。

    (2)第二个作用就是一个特殊标记。按照标准的指针使用步骤是:

    int *p = NULL;        // 定义p时立即初始化为NULL
    p = xx;
    if (NULL != p)
    {
            *p  // 在确认p不等于NULL的情况下才去解引用p
    }
    p = NULL    

    注意:一般比较一个指针和NULL是否相等不写成if (p == NULL),而写成if (NULL == p)。原因是第一种写法中如果不小心把==写成了=,则编译器不会报错,但是程序的意思完全不一样了;而第二种写法如果不小心把==写成了=则编译器会发现并报错。

    4注意不要混用NULL与'\0':     (1)'\0' 和 '0' 和 0  和 NULL几个区分开。

    (2)'\0'是一个转义字符,他对应的ASCII编码值是0,本质就是0。

    (3)'0'是一个字符,他对应的ASCII编码值是48,本质是48。

    (4)0是一个数字,他就是0,本质就是0。

    (4)NULL是一个表达式,是强制类型转换为void *类型的0,本质是0.

    总结:'\0'用法是C语言字符串的结尾标志,一般用来比较字符串中的字符以判断字符串有没有到头;'0'是字符0,对应0这个字符的ASCII编码,一般用来获取0的ASCII码值;0是数字,一般用来比较一个int类型的数字是否等于0;NULL是一个表达式,一般用来比较指针是否是一个野指针。

    1a7003899852173c17c50d7e5a84c811.gif

    关注公众号,每周分享至少3篇开源技术干货,文章中如有没看懂的地方可以私聊我,我看到了会立马回复你,个人微信号:a18879499804,在看的话,帮忙点个赞,非常感谢!

    a8628bb3f751272c1e8894a76f8f04b0.gif

    8f52657781a6ffe0190616fc516583bf.png

    展开全文
  • option里面写一些默认的值;页面引用后,发现不能成功使用或覆盖组件option中默认的值。 请问,有什么好的办法吗?</p><p>该提问来源于开源项目:xlsdg/vue-echarts-v3</p></div>
  • 最近在优化项目看到多个 jar(A.jar B.jar C.jar) 包里面都创建了同样的 utils 类,里面代码都大同小异,于是乎就删除了这些utils类,创建了一个utils.jar 给其他jar(A.jar B.jar C.jar) 引用,然后把 A.jar B.jar...
  • iframe里面引用的第三方的链接地址,现在想实现点击之后iframe里面显示,怎么实现,别说什么target,因为是第三方的链接,总不能修改别人的网页吧。求大神
  • 如何在unity3D里面引用dll

    千次阅读 2015-10-28 10:45:39
    首先打开vs新建一个项目:建立的项目是c#的类库文件。位置任意。...然后就可以vs中添加引用,打开解决方案资源管理器鼠标右键点击引用选择添加引用然后浏览里找到刚才复制的dll然后选择后按确定这样u
  • CCHttpRequest 本身是一个CCObject 对象, 用于lua的create函数 默认会retain request对象一次,因此需要在lua的callback函数里面处理结束request之后,...autorelease 引用计数先变成2 变成1 , 将对象加入自动释放
  • chan类型复制 //chan的复制 chan1 := make(chan int, 2) chan2 := chan1 chan1 <- 1 v := <...来看下slice类型的复制 //slice的复制 slice1 := make([]int, 10, 20) slice2 := s.
  • 我将控制器 Controller 按照不同的业务,分为多个不同的项目,我需要在路由里面调度到多个不同项目的控制器 只需要在 Startup 的 ConfigureServices 方法,调用 AddControllers 添加控制器,加上额外的程序集...
  • 问题显像:在对项目做了修改后pom.xml里面引用的所有jar包全部均报失效,无法正常引用,项目中写了main函数测试的方式进行类测试时报找不到主函数错误,将pom.xml对应的引用删除后,对应的所依赖的java代码就会报找...
  • 引用

    2021-01-19 23:46:18
    引用本质上就是一个指针,引用就对应一块内存空间,里面存的就说一个地址。 C 的指针功能是很多的,如:取地址,解引用,加减整数,指针比较,[] 取下标… Java 的引用就把上面的很多功能裁剪掉了: 把取地址,加减...
  • 今天给大家分享一下这段时间学习c++的总结学习:c++里面的const关键字和引用。一、const关键字的总结1、const什么时候为只读变量,什么时候又是常量呢?(1)const常量的...
  • 首先,得设置Formatting 点击保存生效后,回到工程页面 ... 不用犹豫,直接点“Run”,运行完后查看各个java类,已经把不需要的引用,全都去掉了! 该方法对jsp文件和xml文件好像也行。...
  • 我今天才知道,在C#里面光添加引用而不用using关键字,是可以引用外部库的,但是不引用外部库而只引用“using”可能会找不到你想要的。 这是因为: using命令是告诉编译器,我这个类里,使用某个...
  • 标题党了额,mark一下,有时间整理。 以下节选自多人博客。...C++里面双冒号和冒号及点号引用符的用法与区别 在类外定义函数的时候,要用到void ClassName::FuntionName(pram){} 在定义类的静态变量的时候需要in
  • 这是因为在线程里面没有初始化pythoncom,需要在你的线程任务里面再加一段代码 import pythoncom pythoncom.CoInitialized() 一般建议放在线程函数的开头处
  • 如何利用matlab根据excel表格里面的数据画图将Excel数据导入MATLAB需要先据录入到Excel中,然后将其导入到MATLAB中参与矩阵运算。具体步骤如下:1、将待导矩阵结构数据录入到Excel中,录入时注意行列要跟原矩阵...
  • 下面第一个函数就是我想要在第二个函数里面用的,而第二个函数是第一个引用的 void CZHANGMIN1View::InsertSort(unsigned char *pArray, int iLength) { unsigned char tmp; int i, j; for(i = 1; i ; i++) { j = i-...
  • 背景平时不很常用正则表达式,临时需要也是先查网络上的资料,阅读理解,然后用。但是,很多情况下,正则表达式很有用。比如,以前帮一研究人员进行超级复杂的一个不小的方程组求解,原始公式里面涉及变量、常量、...
  • 囧,,,,, 新学C# ,写了个冒泡排序,结果出现了些小问题,声明一...原来数组参数是引用类型的,也就是说调用排序函数以后原数组的排列顺序已经改变,恍然大悟,并且,不用排序函数中再次返回一个结果数组!! 
  • C++指针和引用

    2018-08-30 09:50:41
    指针里面存的是某个变量的地址。 变量的引用就是一个变量的别名,变量和变量的引用代表着同一个变量。 紧跟在类型后面的&amp;amp;amp;符号就是引用的声明符号,其他情况...声明一个引用后,不能让其作为另一个...
  • 我今天才知道,在C#里面光添加引用而不用using关键字,是可以引用外部库的,但是不引用外部库而只引用“using”可能会找不到你想要的。这是因为:using命令是告诉编译器,我这个类里,使用某个命名空间是,不用写...
  • 引用计数

    2017-08-28 17:58:20
    引用计数,使用浅拷贝,同时也不会错误的释放了内存,引用数为0我delete掉 注意,引用计数部分,应该做到不同对象都能访问到,放到堆内存, 一个成员变量,指向堆里面一块空间,这块地方用于管理引用数, 浅拷贝的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,515
精华内容 1,006
关键字:

引用里面再引用