深入理解: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相当于一片大空间,里面有很多个小空间。


原文地址:https://www.cnblogs.com/xiegalpha/p/9231663.html