精华内容
下载资源
问答
  • n个引用变量指向同一个对象,通过一个变量修改对象内部数据,其它所有变量看到是修改之后数据 光看文字是看不懂,我们来看一个例子 var a = { name = "Ankry" }; var b = a; b.age = 12; console.log(a.age);...

    今天看了尚硅谷javascript高级部分的视频,收获颇大,尤其是这个视频

    https://www.bilibili.com/video/BV1p4411u7TT?p=145

    老师讲解得非常好,在此整理一下,并附上自己的理解

    2个引用变量指向同一个对象,通过一个变量修改对象内部数据,另一个变量看到的是修改之后的数据

    光看文字是看不懂的,我们来看一个例子

    var a = { name:"Ankry" };
    var b = a;
    b.age = 12;
    console.log(a.age);
    

    答案很明显,是12。刚开始我不懂,为什么明明是把a赋值给b,修改b,关a什么事?
    后来弄清楚后,只需要一个图就搞定了

    在栈空间里,存储的是变量名。 在堆空间里,存储的是对象本身。

    首先在第一步, 栈空间的a指向堆空间的对象{ name = “Ankry” }

    var a = { name:"Ankry" };
    

    第二步,把 a 的内容赋值给b,a的内容是地址值,所以 b = a 的地址值,指向同一个对象

    var b = a;
    

    第三步,通过变量 b 修改对象内部数据,因为是指向同一个变量,所以 a.age=12

    b.age = 12;
    

    在这里插入图片描述

    同样如果创建一个函数,也是如此。
    这里 obj 是形参, a 是实参,相当于 obj = a;
    a 、b、obj 指向同一个对象

    var a = { name:"Ankry" };
    var b = a;
    b.age = 12;
    console.log(a.age);
    
    *******
    function fn1 (obj){
    obj.name = "Brish"
    }
    
    fn1(a)
    console.log(b.name); //Brish
    

    两个引用变量指向同一个对象,其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个对象。

    var a = { age:14 };
    var b = a;
    a = { name:"Brish" , age:12 };
    b.age = 15;
    console.log(a.age, b.age, a.name);  
    

    a.age = 12 ;
    b.age = 15 ;
    a.name = Brish

    为什么会这样呢?
    在这里插入图片描述

    刚开始 a 和 b 都指向同一个对象,但是 a 又新建了一个对象,指向了新对象

    a = { name:"Brish" , age:12 };
    

    于是 b.age =15 ; 而此时 a 不变, a = 12;
    此时再用另一个小例子加深一下印象

    function fn2( obj ){
    	obj = { age: 16 };
    }
    fn2(a);
    console.log(a.age);  // 12
    

    你会很迷惑,为什么是12?
    看一幅图,你就会明白
    在这里插入图片描述
    从这里我们知道,实参传递给形参,相当于 obj = a ;

    fn2(a);
    

    a 的内容赋值给 obj ,obj 与 a 同时指向 age:12;
    然后函数 fn2 里,相当于给 obj 新创建一个对象,但是并不影响 a 指向的对象
    所以最后 a.age = 12 ;

    function fn2( obj ){
    	obj = { age: 16 };
    }
    

    函数内部的局部变量会被释放
    { age:16 } 最后会变成垃圾对象

    展开全文
  • 每一条语句以换行结束一条语句需要多行编写时候,在一行末尾以\结束,下一行和这行就是同一条语句python是严格缩进,缩进代表是代码块在python中#表示注释python中使用变量是不需要声明,直接给变量赋值就行了...

    基本的语法

    肯定严格区分大小写之类的

    一行就是一条语句,每一条语句以换行结束

    一条语句需要多行编写的时候,在一行的末尾以\结束,下一行和这行就是同一条语句

    python是严格缩进的,缩进代表的是代码块

    在python中#表示注释

    python中使用变量是不需要声明的,直接给变量赋值就行了,而且python是动态类型的语言,可以为变量赋任何类型的值,赋值后又可以修改成任意类型的值

    python的数值分为三种:整数,浮点数,复数

    整数int

    在python中所有的整数都是int类型的,而且它不像其他语言那样有大小限制的,python的int类型是没有限制的,可以是一个无限大的整数,如果数字的长度过于长,还可以用下划线进行分割,例如a=45_46_45,这里a的值就是454645,编译的时候将_忽略了

    浮点数float

    python的不同进制的表示

    二进制:以0b开头

    八进制:以0o开头

    十六进制:以0x开头

    python的字符串

    字符串

    使用时需要用单引号(’’)或者双引号("")引起来,两者不能混合着用,相同的引号不能嵌套着用

    长字符串

    使用三个引号来表示长字符串,’’‘或者""",长字符串可以换行,而且还会保留文本中的格式

    10. 转义字符

    python可以使用(反斜杠)作为转义字符,例如:

    \‘表示’

    \“表示”

    \t表示四个空格,就是一个tab键

    \n表示换行

    \\表示反斜杠

    \uxxxx表示利用Unicode进行编码的,比如在Unicode编码里面,第0048个是H,如果你写a=’\u0048’,a就表示字符H.为什么是四个数字?因为Unicode编码里面用四位`进行编码

    10. 格式化字符串(四种方法)

    ①:两个字符串可以进行加法连接,但是不可以和其他数据类型进行加法运算

    ②:print(变量1,变量2),这里打印后变量1和变量2也是拼接起来的,而且这里是没有数据类型限制的,两个变量什么类型都行,不同类型也可以

    ③创建字符串的时候可以指定占位符,例如:

    a=‘hello%s’%变量 #这里就是用变量替换了字符串a的%s的占位符

    %s

    #这个表示任意的占位符,在%s的位置可以填充字符串,整数,浮点数等等,

    而且这里的占位符还可以做限制,例如%2.3s #这个表示这个占位符最少有两位,如果不足两位就在前面填充空格补完整到两位,如果超过三位就不要后面的

    %f

    #这个是浮点数的占位符,这里的%4.1f 和上面的就有点区别了,4还是不够四位补空格,但是1就是小数点后面保留一位小数

    %d

    #这个是整数的占位符

    ④格式化字符串,就是可以通过在字符串前面添加一个f来创建一个格式化字符串,在格式化字符串中是可以直接加入变量的,比如a=f’啦啦啦{x1}{x2}’ #这里的x1和x2是一个变量,什么类型都可以

    字符串复制,就是将字符串和一个数字进行乘法运算,这时就会将字符串复制到那个数字的次数

    布尔值(Boolean,在python里面简写成bool)

    一共有两个True和False,

    其实bool的数据类型也是属于整形,True相当于1,False相当于0,1+True等于2的

    None(空值),就什么都没

    类型检查的函数:type() #这个函数传入一个变量,返回这个变量的数据类型

    对象(object)

    python也是面向对象的语言,对象是内存中专门用来存储指定数据的一块区域,它实际就是一个容器,上面的数值,字符串,bool,None都是对象

    对象的结构:对象里面都会存储这三种数据:id,type,value

    id:

    就是这个对象的标识,每一个对象都只有一个唯一的id,如果要查看,可以通过id()函数来查看对象的id,这个id是由解释器生成的,一旦创建就永远不可能改变,在cpython中,id就是对象的内存地址

    type:

    python是强类型的语言,对象一旦创建,类型就不能修改

    value:

    对象中存储的具体数据,可变对象的值可以改变,不可变对象的值不能改变,int ,str,Boolean…的值都是不可以改变的

    17. 变量和对象的关系

    在变量中不是直接将python的对象直接存储进去,而是存储对象的id,在python中,变量就好像给对象起了一个别名.

    如果你执行了a=10a=ba=20#这时候b里面存储的值是没有改变的还是10,就是b里面的id没有变,所以python里面的变量是相互独立的,其中一个改变了不会影响其他的

    18. 类型转换

    不是说python是强类型语言吗?类型怎么还可以转换呢?

    其实是这样的,类型转换不是改变这个对象本身的类型,而是创建一个新的需要的类型的对象,然后将当前对象的值赋值给新的对象的值

    对于类型转换有四个函数int(),float(),str(),bool()

    int()

    #将其他的对象类型转化成整型

    规则:

    True—>1 False---->0

    浮点数就直接删了小数点后面的东西,直接取整

    字符串,将合法的整数字符串转化成对于数字,不合法报错ValueError

    其他的和int()差不多,说下bool()

    bool()

    将其他对象转化成布尔值,任何对象都可以转换成bool值,

    规则:所有的表示空的对象都转化成False,例如0,none,其他的都转换成True

    19. 运算符

    算术运算符

    数学中的±

    /就不说了,还有

    // 表示整除,保留计算后的整数,返回一个整数,

    ** 表示幂运算,比如2 ** 3等于8

    赋值运算符

    =,+=,-=,

    =,/=,**=,//=,%= #简单,不多说

    注意一下:就是对于浮点数运算,返回的结果还是浮点数,比如10.0//4的结果是2.0

    关系运算符

    />,/>=,/

    注意一下:

    ①就是如果是两个字符串进行大于(等于)或小于(等于)的运算时,比较的是字符串对应的Unicode编码,比如’a’>‘b’ #False,因为a的编码在b的前面

    如果字符串是多位的字母,这时就是逐位进行比较的,而且是前面如果比较出来大小,后面的就不再进行比较了,比如’5’

    ②这里的比较==和!=比较的是两个对象的value(值),而不是id,只要是值是一样的就返回True,比如(1 ==True) #这里返回的是True,因为他们两个的值都是1

    ③如果要想比较两个对象的id是否一样,有is和is not

    is是比较两个对象是否是同一个对象,比较的是id

    is not相反

    逻辑运算符

    and:逻辑与

    逻辑运算的与运算

    python的与运算是短路的与运算,如果第一个就是False了,就不会理第二个值是什么

    or:逻辑或

    逻辑运算的或运算

    python的或运算也是短路的或运算,如果第一个就是True,就不会理第二个值是什么

    not:逻辑非

    对于布尔值是取反操作,

    对于非布尔值是将它转化成布尔值再取反

    非布尔值的与或运算

    python对非布尔值进行与或运算的时候,python会将它们当作布尔值进行运算,最终会返回其中一个原值

    与运算规则:本来就是找False,如果第一个值是False,就不会看第二个值,直接返回第一个值,否则返回第二个值

    或运算规则:本来就是找True ,如果第一个值是True,就不会看第二个值,直接返回第一个值,否则返回第二个值

    再python中独特的逻辑运算符用法:连着写,比如:

    print(10<20<30) #True

    这里相当于10<20 and 20<30

    条件运算符(也叫三元运算符

    语法:语句1 if 条件表达式 else 语句2

    执行流程:先对条件表达式进行求值,

    如果条件表达式是True,就执行语句1,并且返回执行结果

    如果条件表达式是False,就执行语句2,并且返回执行结果

    比如:求较大值a=23 b=26

    max=a if a>b else b

    运算符优先级

    查表吧,不常用.(例如and比or高)

    展开全文
  • 变量对象的引用区别:class person():population=1def __init__(self,name,age):self.name=nameself.age=agedef output(self):print('my name is {}'.format(self.name),'人数为:',person.population)#或者换个...

    变量和对象的引用区别:

    class person():

    population=1

    def __init__(self,name,age):

    self.name=name

    self.age=age

    def output(self):

    print('my name is {}'.format(self.name),'人数为:',person.population)

    #或者换个输出语句:

    print('my name is {},人数为:{}'.format(self.name,person.population))

    #实例化person类

    P=person("Li",25) #"Li"对应__init__(self,name,age)的name.同时,25对应其内的age。

    #个数不能少,不能多

    P.name="zhang" #调用类内的对象name。

    person.population=5 #调用类内的参数population

    P.output() #调用函数时,与类内的函数形式参数个数一致。

    #输出结果:

    My name is zhang 人数为:5

    建立了一个person类,其中:population是person类内的变量,name和age是self的对象。使用时Person.population来引用变量population。而self.name来引用name对象变量。

    也是就:population是类的变量,这个类的对象共享使用,而name,age是对象的变量。

    P.name="zhang",通过实例对象P将类的对象name,赋值新的值。 针对的实例类P的对象

    Person.Population=5,通过实例化类的参数赋新值。 针对类名person的参数

    注意:在实例化类的时,类内的参数个数要与定义的类的参数个数及属性对上。

    使用population变量时,不能P.person.population=5,应是person.pupulation=5

    展开全文
  • 变量对象的一个引用(也可以称为标签或者名字),对象的操作都是通过引用来完成的。例如,[]是一个空列表对象,变量a是该对象的一个引用a=[]a.append(1)在Python中,变量更准确的叫法是名字,赋值操作= 就是把一个...

    变量和对象

    Python中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象。而变量是对象的一个引用(也可以称为标签或者名字),对象的操作都是通过引用来完成的。

    例如,[]是一个空列表对象,变量a是该对象的一个引用

    a=[]

    a.append(1)

    在Python中,变量更准确的叫法是名字,赋值操作= 就是把一个名字绑定到一个对象上,就像给对象添加一个标签。

    a=1 #整数1赋值给变量a就相当于是在整数1上绑定一个a标签。

    a=2 #整数2赋值给变量a,就相当于把原来整数1身上的a标签撕掉,贴到整数2身上。

    b=a #把变量a赋值给另外一个变量b,就相当于在对象2上贴了a、b两个标签,通过这两个变量都可以对对象2进行操作

    变量本身没有类型信息,类型信息存储在对象中,这和C/C++中的变量有非常大的出入(C中的变量是一段内存区域)

    函数参数

    Python函数中,参数的传递本质上是一种赋值操作,而赋值操作是一种名字到对象的绑定过程

    def foo(arg):

    arg = 2

    print(arg)

    a = 1

    foo(a) # 输出:2

    print(a) # 输出:1

    解读:在代码段1中,变量 a 绑定了 1,调用函数 foo(a) 时,相当于给参数 arg 赋值 arg=1,这时两个变量都绑定了 1。在函数里面 arg 重新赋值为 2 之后,相当于把 1 上的 arg 标签撕掉,贴到 2 身上,而 1 上的另外一个标签 a 一直存在。因此 print(a) 还是 1。

    def bar(args):

    args.append(1)

    b = []

    print(b)# 输出:[]

    print(id(b)) # 输出:4324106952

    bar(b)

    print(b) # 输出:[1]

    print(id(b)) # 输出:4324106952

    代码解读:执行 append 方法前 b 和 arg 都指向(绑定)同一个对象,执行 append 方法时,并没有重新赋值操作,也就没有新的绑定过程,append 方法只是对列表对象插入一个元素,对象还是那个对象,只是对象里面的内容变了。因为 b 和 arg 都是绑定在同一个对象上,执行 b.append 或者 arg.append 方法本质上都是对同一个对象进行操作,因此 b 的内容在调用函数后发生了变化(但id没有变,还是原来那个对象)

    展开全文
  • 在搜索平台上关于类以及对象都已经被霸屏了,主要的问题无非就是两个,一个是理解二者,另一个就是理解二者之间的使用关系,对于小编来说,两者统一跟...这就是二者之间的关系,有人理解成包含情况也可以。定义类/...
  • 变量和对象之间是引用的关系,即一个变量指向一个对象所代表的存储空间。(类似于指针) Python会自动跟随变量到对象之间的连接: 变量是一个系统表的元素,拥有指向对象的连接的空间 对象是分配的一块内存,有足够...
  • id(变量) == 变量所指向的对象的地址可变对象:list dict对象的值可以改变不可变对象:int string numbers bool对象的值在它被分配内存的那一刻起就不能改变。函数改不改变实参的值:python函数参数传递:引用传递。...
  • 必须new操作以后才可以,此时变量保存了对象的地址,就可以调用对象的api方法了 更改器:比如集合的add方法,对原对象数据造成改变 访问器:比如Array.copyOf他们使用后不对原来对象数据造成破坏仅仅是获取数据 ...
  • 在上面的代码中,顶层对象的属性赋值全局变量的赋值是一样的。 顶层对象的属性全局变量挂钩,被认为是 JavaScript 语言最大的设计败笔之一。这样的设计带来了几个很大的问题,首先是没法在编译时就报出变量未...
  • 什么是对象?什么是变量?在python中,一切都是对象,一切都是对象的引用。...引用是自动形成的从变量对象的指针。举个例子:xy = 20 总共完成了三件事:①创建了一个int类型的对象20②创建了一个...
  • 通常把这条语句动作称之为创建一个对象,其实,它包含了四个动作。这条语句首先先进行右半边new Vehicle();new Vehicle,是以Vehicle类为模板,在堆空间里创建一个Vehicle类型的对象(简称为Vehicle对象)。末尾()...
  • 我们定义了一个名为 f 函数,函数内没有对变量进行声明,直接给 fff 变量进行了赋值,并且在外部调用了 f 函数,我们输出一下 fff 的变量,大家猜一下代码效果如何: 它可以正常输出。。。 我们再看另一段代码: ...
  • 如果脚本中的变量声明出现在命名元素之前,那这个变量的存在就会组织元素获取他window属性 。而如果脚本中的变量声明出现在命名元素之后,那么变量的显示赋值会覆盖该属性隐式值。
  • 一、概述和安装这些函数允许你获得类和对象实例的相关信息。 你可以获取对象所属的类名,也可以是它的成员属性和方法。 通过使用这些函数,你不仅可以找到对象和类...二、类与对象函数大全__autoload — 尝试加载...
  • 对象的本质是:对象是分配的一块内存,有足够的空间去表示它们所代表的值。—— 《Learning Python》或者说:一块内存空间,拥有特定的值,支持特定类型的相关操作2.对象的特点:Python中,对象具有三要素:标识...
  • 理解引用变量的概念,类创建的对象实际在堆内存中存放,而创建的变量实际在栈内存中存放,这就是通过访问引用变量内的值间接的访问对象值,即访问引用变量的成员变量和方法就是访问对象的成员变量和方法!
  • 2、类与对象的关系 3、局部变量和成员变量的关系 4、封装思想 5、private,this关键字 6、随机点名器 ###01面向对象和面向过程的思想 * A: 面向过程与面向对象都是我们编程中,编写程序的...
  • 今天在学习了类与对象的分别之后,了解如何使用类去写一个模板,给对象使用。 类和对象的关系 * A: 类和对象的关系 * 类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体 * B: 举例 * 可以将玩具模型...
  • 7.2 指针与变量的关系

    2019-10-19 22:33:43
    变量与指针变量: (1)变量有地址,指针变量可以存放变量地址。 (2)当指针变量中存放某个变量地址后,我们就说该指针变量指向这个变量。 使用指针变量三个基本步骤: (1)定义指针变量:即给指针...

空空如也

空空如也

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

变量与对象的关系