zoukankan      html  css  js  c++  java
  • 深入理解:Python基础概念辨析之高阶基础____容易混淆的概念

    # 这种类似的文章个人觉得还是非常有价值的,所以近期打算出一篇。

    # 后面会进行多次更新


    • 1.字典方法keys和values中的概念:
      • dict.keys() 或 dict.values()生成的虽然是一个类似列表对象,可以对其进行遍历,但是并不能进行列表的操作。
        one_dict = {"中国": "北京", "法国": "巴黎", "美国": "纽约"}
        print(one_dict.keys())
        for i in one_dict.keys():
            print(i)
    # 但是使用其他常见列表方法则不可以               
    
    • 2.关于可变类型数据结构 与 python中变量--标签概念的理解
    a = b = []
    b.append(1)
    print(a)
    print(b)
    
    # 第一个输出结果:
    [1]
    [1]
    
    a = b = []
    b = [1]
    print(a)
    print(b)
    
    # 第二个输出结果:
    []
    [1]
    
    解释:
    第一个例子中,a,b变量(标签)指向的是同一个内存地址,变量b调用了列表对象的append方法,相当于进入b指向的内存空间内部进行了内容的修改,所以同样指向同一块儿内存空间的变量a的内容也跟着变化。print函数操作的过程是对变量指向的内存地址的内容进行输出。
    
    第二个例子中,a,b变量最开始指向了同一个内存空间,但是随后变量b(标签)从指向a变换到指向新的内存空间(内容为[1]的空间),而a指向的内存空间并未改变,所以打印结果如上。PS:用赋值的方式,意味着重新创建一个块儿新的内存地址。和调用方法不同。
    • 3.函数进阶 与 可变类型和不可变类型 与 局部变量全局变量

    "注:"这个问题是上一个问题的扩展:

    def demo(num, num_list):
        # 赋值语句
        num = 200
        num_list = [1, 2, 3]
    
        print(num)
        print(num_list)
    
        print("函数代码完成")
    # python解释器中是逐行翻译,首先开辟一块内存存储int对象:99,并生成标签gl_num指向它; (先看右边,再看左边)
    # 再开辟内存,存放列表[456],然后生成变量gl_list(标签)指向它
    # 在掉用函数的过程中,def后面的形式参数作为变量(标签)分别指向:numgl_num都同时指向了99num_listgl_list都指向了[4,5,6]
    # 但是进入函数内部,函数开辟新内存空间创建int对象200,并将局部变量num(标签)从指向99改成指向200;同理,num_list 也指向了[1,2,3]
    
    
    gl_num = 99
    gl_list = [4, 5, 6]
    demo(gl_num, gl_list)
    print(gl_num)
    print(gl_list)
    
    # 运行结果:
    200
    [1, 2, 3]
    函数代码完成
    99
    [4, 5, 6]
    
    在函数内部,针对参数使用 赋值语句,会不会影响调用函数时传递的 实参变量? —— 不会!
    无论传递的参数是 可变 还是 不可变
    - 只要 针对参数 使用 赋值语句,会在 函数内部 修改 局部变量的引用,不会影响到 外部变量的引用
    def mutable(num_list):
    
        # num_list = [1, 2, 3]
        num_list.extend([1, 2, 3])
        
        print(num_list)
    
    gl_list = [6, 7, 8]
    mutable(gl_list)
    print(gl_list)
    
    # 执行结果:
    [6, 7, 8, 1, 2, 3]
    [6, 7, 8, 1, 2, 3]
    
    • 4.函数进阶 与 可变类型和不可变类型 与 局部变量全局变量
    def demo(num, num_list):
        print("函数开始")
        # num = num + num
        num += num
    
        # num_list = num_list + num_list
        # 列表做 += 并不会做相加再赋值操作
        # Python中针对列表操作 += 运算的时候,本质上是调用了 extend()方法
    
        num_list += num_list
        print(num)
        print(num_list)
        print("函数完成")
    
    
    gl_num = 9
    gl_list = [1, 2, 3]
    demo(gl_num, gl_list)
    print(gl_num)
    print(gl_list)
    
    #执行结果:
    函数开始
    18
    [1, 2, 3, 1, 2, 3]
    函数完成
    9
    [1, 2, 3, 1, 2, 3]
    
    • 5.函数和类定义上的一些区别:

      • 函数命名一般使用小驼峰或者单词之间下划线连接的方式
      • 类命名采用大驼峰法,不使用下划线
      • 函数用def关键字,类用class关键字
      • 函数def 变量名后面要加小括号;类后面不需要括号,直接在变量名后面加冒号
      • 类的方法(函数)中必须要加self参数,否则报错
    • 6.del

      • 作为关键字 不需要括号, del ls 或 del ls[1]
      • 作为函数del(ls) 或 del(ls[1])
      • 本质上是从内存中删除,ls相当于一片大空间,里面有很多个小空间。


  • 相关阅读:
    区块链基础语言(十二)——Go语言跳转语句
    区块链基础语言(十一)——Go语言循环语句
    区块链基础语言(十)——Go语言选择语句
    区块链基础语言(九)——Go语言运算符
    区块链技术语言(八)——Go语言常量
    区块链基础语言(七)——Go语言变量
    区块链基础语言(六)——Go语言数据类型
    区块链基础语言(五)——Go语言结构
    区块链基础语言(四)——Go语言工程管理
    人生苦短,我用 Python
  • 原文地址:https://www.cnblogs.com/xiegalpha/p/9231663.html
Copyright © 2011-2022 走看看