今天突然脑子发抽,想到py里有没有指针这个概念,于是我马上google、baidu了一波,发现网上大多都在说py、java、c#这类纯面向对象的编程语言用对象的概念能完全替代指针。那么问题来了,没有指针,py是如何来修改传入函数参数的值的呢?

我们知道py里的变量名是种虚无缥缈的东西,有人把py的变量名形象地比作为标签,给变量赋值就是把变量名“贴到”一块内存上,看下面这个例子你就懂了:


py运行图

但学过c/c++语言的童鞋都知道,在c/c++中,变量是先声明再使用,在声明时就是为变量开辟内存,所以即使把一个变量赋值给另一个变量,他们的内存地址也是不同的:


c++运行图

那如果是列表名这种类似c中的数组的变量名(c/c++中,数组名就是数组第一个元素的指针)呢?我做了几个小实验,发现python中的列表名十分有意思:


py运行图

我们可以发现,py中列表名是块大标签,而列表中的元素又分别是块小标签,大标签包含小标签,小标签内容的变动是独立的,既不会影响其他小标签的内容,也不会影响大标签的内容,但如果大标签内容改了则会使所有小标签的内容都会换过。这样就能解释下面这段程序了:

而py中对于函数名,类名等,我们都可以将其看作是大标签,而其中的变量名为小标签,函数参数中传入大标签就能修改小标签了,但如果只传入小标签,则我们改不了大标签中的内容。

再次我们总结一下,py中列表名,字典名,集合名,函数名,类名,(元组改不了)这些我们可以看作是大标签,他们中的元素又分别是小标签,大标签包含小标签,小标签内容的变动是独立的,既不会影响其他小标签的内容,也不会影响大标签的内容,但如果大标签内容改了则会使所有小标签的内容都会换过。

py中变量名的“秘密”的更多相关文章

  1. JS中变量名作为if条件的 true/flase

    在Javascript中,可以直接将变量名放到if条件中, var a;//甚至不定义 if (a){ //... } 以下情况被认为是flase: 1.''空的字符串 2.数字0 3.对象null ...

  2. 如何解决eclipse、MyEclipse中变量名自动补全问题

    背景:这个问题困扰了很长时间,解决过程也并不顺利.不断的试错,再次让我理解这下面这句话—— 世界上对的路可能只有一条,错的路却可能有成千上万条,不要成为别人的前车之鉴.开发之路,只需要记住对的路就行了 ...

  3. C语言中变量名及函数名的命名规则与驼峰命名法

    一.C语言变量名的命名规则:(可以字母,数字,下划线混合使用) 1. 只能以字母或下划线开始:2. 不能以数字开始:3. 一般小写:4. 关键字不允许用(eg:int float=2//error  ...

  4. Py基础—变量名,条件循环,空执行,编码,运算符,字符比较,简化写法

    变量名 只能是字母,数字,下划线.数字不能开头,不要和python内置的东西重复.赋予变量名内容:name1 = "shit" 输出变量名内容 print(name1) 条件语句 ...

  5. JS中变量名和函数名重名

    今天骚凯问了一道变量名冲突的题目,感觉很有意思,顺便也复习一下预解析的一些知识,有不对的地方忘前辈大神指正,题目是这样的: var a=100; function a(){ console.log(a ...

  6. Python中变量名里面的下划线

    1 变量名前后都有两个下划线(__X__),表示是系统级变量: 2 变量名前只有一个下划线(_X),表示该变量不是由from module import *导入进来的: 3 变量名前有两个下划线(__ ...

  7. ie7,ie8 js中变量名和页面元素ID重名,报错

    js变量名和一个div的id重名,报错.不知所以然...做个标记

  8. C中变量名通过宏定义转换成char*类型字符串

    #include <iostream> #include <stdlib.h> #define name_to_str(name)(#name) int main() { in ...

  9. js中变量名加“-” new Vue()不执行

    如var app-1 = new Vue(): 不执行的 var app1 = new Vue(): 才能执行

随机推荐

  1. adb命令—monkey篇

    monkey 目录 monkey 1.Monkey介绍 2.Monkey是用来做什么的 3.Monkey程序介绍 下面就是一些Monkey命令了 1.Monkey介绍 顾名思义,Monkey就是猴子, ...

  2. C#开发PACS医学影像处理系统(十七):2D处理之影像旋转和翻转

    1.任意角度旋转 在XAML设计器中,设置RotateTransform属性 <InkCanvas x:Name="ToolInkCanvas" UseCustomCurso ...

  3. TP 3.2 图片处理类

    TP 3.2 图片处理类 <?php namespace Common\Common; class ImageEdit{ /** * [上传图片并生成缩略图] * @param [type] $ ...

  4. Python练习题 040:Project Euler 012:有超过500个因子的三角形数

    本题来自 Project Euler 第12题:https://projecteuler.net/problem=12 # Project Euler: Problem 12: Highly divi ...

  5. C 面向对象编程 --- 一模块的串口协议解析

    // 任务目的// 解析串口收到的54个字节.这54个字节包含了8个车道的5大信息以及校验信息.// 实现了查询每条车道包含了哪些信息. #include <stdio.h>#includ ...

  6. RTKLIB的主要功能

    RTKLIB是全球导航卫星系统GNSS(global navigation satellite system)的标准&精密定位开源程序包,RTKLIB由日本东京海洋大学(Tokyo Unive ...

  7. P1527 [国家集训队]矩阵乘法(整体二分)

    Link 整体二分的经典例题. 对于整体二分,我个人的理解是二分答案套分治. 具体来说就是对答案进行二分,然后对于询问进行类似于权值线段树求区间第 \(k\) 大的分治做法. 首先,我们暴力做法就是对 ...

  8. DevOps元素周期表—2号元素Kibana

    Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作.您可以使用 Kibana 对 Elasticsearch 索引 ...

  9. vue-integer-plusminus

    下载 vue-integer-plusminusvue-integer-plusminus 带有递增和递减按钮的整数输入 现场演示 该组件适合作为自旋按钮,允许键盘功能(向上/向下箭头或页面向上/向下 ...

  10. URLEncoder.encode编码空格变+号

    今天调用rest接口的时候,使用URLEncoder编码将空格转为了+号,而rest接口方需要将空格转为%20,参照标准 之后用了不少在线的工具测试,有的将空格转为了+号,有的则是转为了%20.看了一 ...