• python基础学习(2)


    1. SyntaxError: unexpected EOF while parsing

    解析时出现错误的文件结束符。检查一下错误句子中是否有括号不匹配等问题

    2、SyntaxError: invalid syntax

    出现无效语法。 

    比如:表示复数complex用“j”,不要错用为i

    3、TypeError: isinstance expected 2 arguments, got 1

    isinstance(), 这个方法应该有两个参数,但是只给出了一个。

    比如,isinstance (10, int)

    4、type和isinstance的区别

    class A:
        pass
    
    class B(A):
        pass
    print(isinstance(B(), A))
    print(type(B()) == A)

    输出为:

    True
    False

    说明:

    • type()不会认为子类是一种父类类型。
    • isinstance()会认为子类是一种父类类型。

    5、预备知识(参考链接戳这里

    为了更直观的理解变量的存储,我们需要首先了解三个概念:id(身份标识)、变量赋值、以及修改。

    (1)id函数:你可以通过python的内置函数 id() 来查看对象的身份(identity),这个所谓的身份其实就是 对象 的内存地址, 就是获取对象在内存中的地址。

    (2)变量赋值:参考7,为了避免为整数频繁申请和销毁内存空间,在一定的范围内的int和str型的数值,当赋值给两个变量时,两个变量所存储的地址相同。但是对于其他数据类型(float, tuple,list,dict或set),即使变量所指向的数值完全相同,也不会是同一个内存地址。如下:

    list1 = [1,2,"abc", 'e', 't']
    list2 = [1,2,"abc", 'e', 't']
    print(id(list1), id(list2))

    结果为:

    1882468179336 1882468342152

    但是如果将一个引用(变量)赋值给另一个变量,两个变量将指向同一个地址,只是会给现存的对象添加一个新的引用,并不会在内存中生成新的对象:

    list1 = [1,2,3,"abc"]
    list2 = list1
    print(id(list1), id(list2))

    结果为:

    1882468366664 1882468366664

    如果采用分片复制,分片[:]复制是不同的,他会创建一个新的对象,list1和list3的值相同,但是地址是不同的,相当于复制了一份新的,如下(copy()函数和分片相同):

    list1 = [1,2,3,"abc"]
    list3 = list1[:]
    print(list1,list3)
    print(id(list1), id(list3))

    结果为:

    [1, 2, 3, 'abc'] [1, 2, 3, 'abc']
    1882468364424 1882466909192

    (3)可变数据类型的修改:对于list,dict或set,如果修改其中某一项元素的值,或者添加几个元素,不会改变其本身的地址,只会改变其内部元素的地址引用。

    print("------原列表------")
    list1 = [1,2,3,"abc"]
    print(list1)
    print(id(list1))
    print(id(list1[1]))
    print("------删除元素------")
    del list1[1]
    print(list1)
    print(id(list1))
    print(id(list1[1]))
    print("------增添元素------")
    list1.append(2)
    print(list1)
    print(id(list1))
    print(id(list1[1]))
    print("------更改元素------")
    list1[1] = 1
    print(list1)
    print(id(list1))
    print(id(list1[1]))

    结果为:

    ------原列表------
    [1, 2, 3, 'abc']
    1882466888904
    140725570941808
    ------删除元素------
    [1, 3, 'abc']
    1882466888904
    140725570941840
    ------增添元素------
    [1, 3, 'abc', 2]
    1882466888904
    140725570941840
    ------更改元素------
    [1, 1, 'abc', 2]
    1882466888904
    140725570941776

    可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址不会改变,只是对应地址的内容改变或者地址发生了扩充,所以对于相同的值的不同对象,会存在多份,即每个对象都有自己的地址。

    (4)不可变数据类型:不可变数据类型int, float, str, tuple,不允许变量的值发生变化,如果改变了变量的值(比如使用+=操作),相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,就是不可变数据类型引用的地址的值不可改变。

    str1 = "ab"
    print(id(str1))
    str1 += "123"
    print(id(str1))

    结果为:

    1882430023360
    1882468372584

    6、Python中变量在内存的存储与地址变化(参考链接戳这里

    Python变量保存的是值的引用 也可以说:变量是内存及其地址抽象。变量所需的存储空间大小一致,因为变量只是保存了一个引用。也被称为对象语义和指针语义。变量的每一次初始化,都开辟了一个新的空间,将新内容的地址赋值给变量。如下图:

    6、is和==的区别(参考这里

    总结: 只有 int 型和 str 型的情况下,a is b才为True,当a和b是float, tuple,list,dict或set型时,a is b为False。

    另外,需要注意的是,a = b = 10; id(a) is id(b) 的结果是False。虽然id(a) 和 id(b) 的值是相同的,原因如下:

    事实上Python 为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。而Python 对小整数的定义是 [-5, 257),只有数字在-5到256之间它们的id才会相等,超过了这个范围就不行了,同样的道理,字符串对象也有一个类似的缓冲池,超过区间范围内自然不会相等了。

    7、深拷贝和浅拷贝(链接:https://blog.csdn.net/as480133937/article/details/87305247

  • 相关阅读:
    UDP协议发送/接收数据实现[TCP/IP协议入门]
    TCP协议发送/接收数据实现[TCP/IP协议入门]
    vue 打包后的build文件过大解决方案
    vuecli 性能优化
    局域网内开启ps登录windows功能
    判断是否是手机浏览器
    java通过模拟post方式提交表单实现图片上传功能实例
    C#中遍历Hashtable的4种方法
    Springboot使用RestTemplate发送Post请求postForEntity (application/json)的坑
    lerna存在的必要性
  • 原文地址:https://www.cnblogs.com/liliwang/p/12674040.html
Copyright © 2020-2023  润新知